在异步代码正在执行时,Express将body设置为"Cannot GET [route]"。
在异步代码正在执行时,Express将body设置为"Cannot GET [route]"。
我有一个使用Mongo数据库存储一些文章的express应用程序。当我等待mongoose模型Article加载时,请求的主体被更改为:
Error Cannot GET /articles
并且状态码被设置为404。我用以下代码查看发送的主体:
function logResponseBody(req, res, next) { var oldWrite = res.write, oldEnd = res.end; var chunks = []; res.write = function (chunk) { chunks.push(new Buffer(chunk)); res.body = Buffer.concat(chunks).toString('utf8'); oldWrite.apply(res, arguments); }; res.end = function (chunk) { if (chunk) chunks.push(new Buffer(chunk)); res.body = Buffer.concat(chunks).toString('utf8'); oldEnd.apply(res, arguments); }; next(); } module.exports = logResponseBody;
这是稍作修改的版本:[https://stackoverflow.com/a/34712950/13300387](https://stackoverflow.com/a/34712950/13300387)。
我的代码如下:
路由:
router.get("/", async (req, res, next) => { console.log(res.body); //undefined console.log(res.statusCode); //200 const articles = await ArticleModel.find(); console.log(res.body); //...Cannot GET /articles... console.log(res.statusCode); //404 res.status(200).json(articles); });
模型:
const mongoose = require('mongoose'); const Schema = mongoose.Schema; const ArticleSchema = new Schema({ title: { type: String, required: true, unique: true }, description: { type: String, required: true }, type: { type: String, required: true } }, {collection: "articles"}); const ArticleModel = mongoose.model('article', ArticleSchema); module.exports = ArticleModel;
在使用Express框架时,如果在执行异步代码时,Express会将响应的body设置为"Cannot GET [route]"。这个问题的出现原因是在使用GET请求时,无法获取响应的body。解决方法是将路由的方法从router.get改为router.post。
以下是代码示例:
// 错误示例 router.get('/route', async (req, res) => { // 异步代码执行中... const result = await someAsyncFunction(); res.send(result); }); // 正确示例 router.post('/route', async (req, res) => { // 异步代码执行中... const result = await someAsyncFunction(); res.send(result); });
在正确示例中,将路由的方法从get改为post。这样就能正确获取到响应的body了。