【发布时间】:2019-04-26 07:35:20
【问题描述】:
这是产品的模型,我有对象的猫鼬模式。
const mongoose = require('mongoose');
const productSchema = mongoose.Schema({
_id: mongoose.Schema.Types.ObjectId,
name: String,
price: Number
});
module.exports = mongoose.model('Product', productSchema);
这是我的 POST 方法。
const express = require("express");
const router = express.Router();
const mongoose = require("mongoose");
const Product = require("../models/product");
router.post("/", (req, res, next) => {
const product = new Product({
_id: new mongoose.Types.ObjectId(),
name: req.body.name,
price: req.body.price
});
product
.save()
.then(result => {
console.log(result);
res.status(201).json({
message: "Handling POST requests to /products",
createdProduct: result
});
})
.catch(err => {
console.log(err);
res.status(500).json({
error: err
});
});
});
问题如下: 每当我在 POSTMAN 上调用 POST 方法时,服务器从不响应,它会在 Visual Studio 代码上给出错误 500 并且服务器崩溃。 POSTMAN 中使用的 body 是正确的,并且与 mongoDB 的连接也是成功的。
服务器打印以下错误:
(node:3214) UnhandledPromiseRejectionWarning: MongoNetworkError: 首次连接时无法连接到服务器 [node-rest-shop-shard-00-00-pbcph.azure.mongodb.net:27017] [MongoNetworkError: connection 4 to node -rest-shop-shard-00-00-pbcph.azure.mongodb.net:27017 超时]
(node:3214) UnhandledPromiseRejectionWarning:未处理的承诺拒绝。此错误源于在没有 catch 块的情况下抛出异步函数内部,或拒绝未使用 .catch() 处理的承诺。 (拒绝编号:1)
(node:3214) [DEP0018] DeprecationWarning:不推荐使用未处理的承诺拒绝。将来,未处理的 Promise 拒绝将使用非零退出代码终止 Node.js 进程。
【问题讨论】:
-
作为一般建议,POSTMAN 通常不是很可靠,您应该真正考虑开始使用 curl 来测试 Web 服务。如果你在 Windows 中,你可以使用 GitBash 或 LSW。
-
MongoNetworkError: failed to connect to server- 应用程序无法连接到您的 MongoDB 服务器。这是一个网络配置问题,与问题中的代码无关。未处理的 Promise 拒绝调用是因为您在调用mongoose.connect()时没有使用.catch(),或者在带有 async/await 的try..catch块内调用。您应该修复该代码,但这里真正的问题是网络。 -
尝试重启你的mongodb服务:sudo service mongod start