在异步代码正在执行时,Express将body设置为"Cannot GET [route]"。

9 浏览
0 Comments

在异步代码正在执行时,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;

0
0 Comments

在使用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了。

0