我今天开始使用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
函数在保存模型实例时遇到问题......
答案 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 --inspect
或nodemon --inspect
),或在帖子功能中插入console.log('inside post');
以查看您和#39;真正进入它。