【问题标题】:Timeout On POST Req Using MEAN Stack使用平均堆栈的 POST Req 超时
【发布时间】:2015-10-08 19:22:09
【问题描述】:

我正在学习使用 Node 和 Express 4.0 创建一个 RESTful API,但在使用 Chrome 中的 Postman 进行测试时,我无法让 POST req 正常工作。调用 save 方法时请求超时(我想——我是新手)。

这是我的基本代码:

server.js:

var express = require('express');   
var app = express();
var bodyParser = require('body-parser');

app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());

var port = process.env.PORT || 8080;

var mongoose = require('mongoose');
mongoose.connect('mongodb://node:node@ds033484.mongolab.com:33484/testdatabase');

var Dog = require('./app/models/dog');

var router = express.Router(); 

router.route('/dogs')
    .post(function(req, res) {
        var dog = new Dog();
        dog.name = req.body.name; 
        dog.save(function(err) {
            if (err)
                return res.send (err);
            res.json({ message: 'Dog created!' });
        });

    });

app.use('/api', router);

app.listen(port);
console.log('Code is testable on port ' + port);

app/models/dog.js:

var mongoose     = require('mongoose');
var Schema       = mongoose.Schema;

var DogSchema   = new Schema({
    name: String
});

module.exports = mongoose.model('Dog', DogSchema);

我使用 Postman 测试了代码,从下拉菜单中选择 POST 并从 Body 选项卡中选择 x-www-form-urlencoded。我填写了键(名称)和值“Clifford”。

请求超时。

所以我在 server.js 中添加了一些控制台日志:

router.use(function(req, res, next) {
    console.log('Router is in use.');
    next();
});

router.route('/dogs')
    .post(function(req, res) {
        console.log("Accessing Mongoose.");
        var dog = new Dog();
        console.log("New dog.");
        dog.name = req.body.name; 
        console.log("The dog is named: " + dog.name);
        dog.save(function(err) {
            if (err)
                return res.send (err);
            res.json({ message: 'Dog created!' });
        });

    });

所有这些都出现了,包括“这只狗的名字是:克利福德”。据我所知,这意味着这是 save 方法的问题。

接下来我应该做什么?任何帮助将非常感激。我在这里发现了类似的问题:no req.body sent on POST requests

但这里的 OP 似乎只是在他的测试中使用了错误的设置并出现错误。我得到的唯一错误是超时。

【问题讨论】:

  • 如果你把console.log放在save函数里面会发生什么?它被正确调用了吗?也就是说,你能连接到mongo吗?
  • 我刚刚添加了以下日志,它没有显示在控制台中。 dog.save(function(err) { console.log("I'm trying to save."); if (err) return res.send (err); res.json({ message: 'Dog created!' }); });
  • 超时错误说它没有连接,但似乎检查登录没有问题(我通过在MongoDB地址中输入错误的密码检查并得到相应的错误)。
  • 如果你在你的 server.js 中添加一些代码来创建一只狗并保存它会发生什么?没有人连接,只需内联测试。
  • 当您要求我将其内联保存时,我不确定您的意思。可以举个例子吗?

标签: javascript node.js mongodb express


【解决方案1】:

如果你替换它会起作用

router.route('/dogs').post(function(req, res) {});

通过

app.post('/dogs', function(req, res) {});

顺便说一句,如果您正在寻找一种比 console.log() 更有效的方式来调试节点服务器,我推荐node-inspector

【讨论】:

  • 替换如下:app.post('/dogs', function(req, res) { console.log("Accessing Mongoose."); var dog = new Dog(); console.log("New dog."); dog.name = req.body.name; console.log("The dog is named: " + dog.name); dog.save(function(err) { console.log("I'm trying to save."); if (err) return res.send (err); res.json({ message: 'Dog created!' }); }); }); 我在 Postman 中得到“Cannot POST /api/dogs”。
  • 我刚刚克隆了 node-inspector 并期待尝试一下。如果这是一个需要解决的陌生问题,这可能是一个很好的机会。
  • 我相信我们有完全相同的代码,它对我有用。有时会发生愚蠢的错误,您确定您的节点服务器和 mongo 服务器已启动吗?不管是现在还是以后,我相信 node-inspector 会帮助你,它真的是一个很好的工具。
  • 我正在重新考虑您的问题,并认为查看我自己的 MEAN 项目的 server.js 可能会对您有所帮助。 Here 是。我希望它会有所帮助。
猜你喜欢
  • 2018-11-29
  • 1970-01-01
  • 2016-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-22
相关资源
最近更新 更多