我正在使用 Express 开发一个全栈 Node 应用程序,并使用 Axios 来调用外部 API。我的 API 调用正在运行,但它似乎没有将任何数据发送回我的路由处理程序,并且我收到浏览器超时消息,然后收到消息:
“本地主机未发送任何数据 ERR_EMPTY_RESPONSE”
这是我的路线处理程序,routes/met_route.js:
'use strict';
import express from "express";
import metData from "../models/metData.js";
const router = express.Router();
router.get('/', metData.searchArt, (req, res) => {
res.send(res.data)
})
export default router;
这是我的 API 调用代码,models/metData.js:
'use strict';
import axios from "axios";
const metAPI = {
searchArt: function() {
axios.get("https://collectionapi.metmuseum.org/public/collection/v1/objects/11")
.then(response => {
console.log(response.data)
})
.catch(error => console.error('error:', error));
}
};
export default metAPI;
我的主server.js文件如下:
import express from "express";
import cors from "cors";
import homeRoute from "../routes/home_route.js";
import metRoute from '../routes/met_route.js';
const PORT = process.env.PORT || 5050;
const app = express();
app.use(cors());
app.use(express.json());
//routing
app.use("/", homeRoute);
app.use("/met", metRoute);
// start the express server
app.listen(PORT, ()=> {
console.log(`server listening on port ${PORT}`);
});
只要我不向 models/metData.js 文件发出 router.get 请求,路线 /met 就可以正常工作,但是一旦我发出该请求,我就会收到上述错误。我想知道这是否可能是异步问题。任何见解将不胜感激。
您的
searchArt
函数除了记录响应之外不会对响应执行任何操作。它作为 Express 中间件函数也是无效的,因为它从不调用 next()
(请参阅 https://expressjs.com/en/guide/writing-middleware.html)。
在我看来,你的
searchArt
函数应该简单地返回一个用你想要的数据解析的承诺。您可以直接从路由处理程序调用此函数,无需尝试将其用作中间件
const metAPI = {
async searchArt() {
return (
await axios.get(
'https://collectionapi.metmuseum.org/public/collection/v1/objects/11',
)
).data;
},
};
// Express v5
router.get('/', async (req, res) => {
res.send(await metData.searchArt());
});
// or
// Express v4
router.get('/', async (req, res, next) => {
try {
res.send(await metData.searchArt());
} catch (err) {
next(err);
}
});