Express JS / MongoDB Post无效

时间:2017-10-25 20:11:29

标签: javascript node.js mongodb express mongoose

我今天开始使用MERN应用,正在尝试编写restful api。首先,我使用mlab来存储我的mongodb数据库。创建用户后,我已成功连接到此数据库。我可以手动创建collection并将一些数据注入此collection。从我的server.js文件中,我可以获得存储在此处的数据。

MongoClient.connect(db_url, (err, database) => {
    if (err) return console.log(err);
    var collection = database.collection('memories'); // Collection called memories
    app.listen(3000, () => {
        console.log("Listening on 3000");
    });
});

这一切都很好,花花公子,但我想把它提升到一个新的水平。我想为集合CRUD写一个Memory api。来自django,我想先创建model。因此,在我的models/memory.js

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

var MemorySchema = new Schema({
    name: String,
    description: String
});

module.exports = mongoose.model('Memory', MemorySchema);

然后我继续开始工作routes/api/api.js

let router = require('express').Router();
let Memory = require('../../../models/memories');

router.use(function (req, res, next) {
    console.log("Something is happening");
    next(); // Request stops at middleware without next()
});

router.route('/memory')
    .post(function (req, res) {
        let memory = new Memory();
        memory.name = req.body.name;
        memory.description = req.body.description;

        memory.save(function (err) {
            if (err) {
                res.send(err);
            }
            res.json({message: 'Memory Created'});
        });
    })

    .get(function (req, res) {
        res.json({message: 'First memory'});
    });


module.exports = router;

在我server.js我称这个模块:

const apiRoutes = require('./routes/api/api');
app.use('/api/', apiRoutes);

但是,在使用postman对post api进行测试后,POST请求才会显示为Could not get any response。但是,GET请求有效。我错过了什么?

编辑:因此post函数在保存模型实例时遇到问题......

2 个答案:

答案 0 :(得分:0)

尝试添加results作为保存功能回调中的第一个参数,然后添加res.json(results, { message: "Memory Created" })以查看是否有任何返回。

答案 1 :(得分:0)

post和get方法的主要区别在于post方法使用Mongoose,而get不用。如果您无法连接到数据库,则由于memory.save(...)无法正常工作,响应可能会超时。并且在回调之外没有响应发送以进行保存,因此如果您的程序从未输入,则永远不会发送响应。请求最终会超时。

在模型文件中,您可以在以下行注册模型:

module.exports = mongoose.model('Memory', MemorySchema);

然后,Mongoose将在 memorys 集合中查找数据。如果将其更改为

module.exports = mongoose.model('Memory', MemorySchema, 'memories');

它将使用记忆集合。这将使其与您发布的连接到数据库片段保持一致。我不知道这是否会解决您的问题。我建议将连接代码更改为

mongoose.connect(dburl, {
  useMongoClient: true
});

而不是本机mongo客户端。您也可以添加这些行

mongoose.connection.on('connected', function () {
    console.log('Mongoose connected');
});

mongoose.connection.on('error', function (err) {
  console.log('Mongoose connection error: ' + err);
});

mongoose.connection.on('disconnected', function () {
  console.log('Mongoose disconnected');
});

在连接代码之后,以帮助调试。确保在启动应用程序时连接。

如果在节点终端窗口中看到类似于此Error: Can't set headers after they are sent.的错误,则可能是因为您在post函数中发送了两个响应。如果在保存时发生错误,则会进入if(err)块,发送响应异步,然后转到res.json(...)响应并发送。

所以你必须在发送响应后返回以退出该函数。要么像这样

res.send(err);
return;

或者像这样

return res.send(err);

json响应相同。

如果这不能解决问题,您应该启动调试器(node --inspectnodemon --inspect),或在帖子功能中插入console.log('inside post');以查看您和#39;真正进入它。