【问题标题】:Node.Js webserver won't access data from mongodbNode.Js 网络服务器不会从 mongodb 访问数据
【发布时间】:2018-05-26 16:08:35
【问题描述】:

我刚刚浏览了一个教程并制作了一个简单的restful api。之后,我在我的数据库中添加了一个管理员用户。当我运行服务器时,身份验证工作,但如果我尝试通过浏览器的 api 访问数据,我会得到永恒的“等待来自本地主机的响应”。既然我已经在 mongodb 中包含了用户身份验证,我不确定我还需要做什么才能处理请求。

var MongoClient = require('mongodb').MongoClient;
MongoClient.connect("mongodb://admin:password@localhost/bookstore?authSource=admin");
app.get("/", function(req, res){
    res.send("Hello World");
});

访问 localhost:3000/ 时,我看到了 hello world,但 localhost:3000/api/books 不会返回任何内容

app.get("/api/books", function(req, res){
    Genre.getBooks(function(err, books){
        if(err){
            throw err;
        }
        res.json(books);
    });
});

这里是 getBooks 函数

module.exports.getBooks = function(callback, limit){
    Book.find(callback).limit(limit);
};

【问题讨论】:

  • 您的错误处理程序是否返回任何内容?
  • 不,它没有。这就是为什么我很迷茫,不知道从哪里开始寻找问题
  • 你有错误处理程序吗?
  • 我问的原因是......要么没有到达路线,要么抛出错误,要么正在返回 json。 “什么都没有”发生的可能性很小。
  • 您的症状,“我得到永恒的“等待来自本地主机的响应”” 表明您没有以导致发送响应的方式处理错误给客户。

标签: javascript node.js mongodb restful-authentication


【解决方案1】:

您没有以任何方式正确处理来自 Node 的回调。您还没有在答案中定义流派或书籍。

也就是说,有几个注释。首先,如果您在回调中,您永远不想抛出错误(如不要使用语法throw err),而是要处理它或将其传递回调用代码。

我使用的常见方法是这样的:

app.get("/api/books", function(req, res, next){ // note adding next here
    Genre.getBooks(function(err, books){
        if(err){
            return next(err);
        }
        return res.json(books);
    });
});

// sometime later, a generic error middleware.  You can make yours more useful
app.use((err, req, res, next) => {
    return res.status(500).send({ message: 'An error has occurred' });
});

您的 mongoclient 连接和 getBooks 语法也可能是错误的,但我无法建议您在不知道您是在使用 Mongoose 还是在做其他事情的情况下修复它的最佳方法。

好的,既然您使用的是 Mongoose,您应该删除您拥有的 MongoClient 代码。而是在应用启动时添加:

const mongoose = require('mongoose');
mongoose.connect('your connectionstring here');

你的getBooks 应该是这样的:

module.exports.getBooks = function(callback, limit){
    Book.find({}).limit(limit).exec(callback);
};

作为旁注,节点应用程序通常使用回调作为参数列表中的最后一个参数,因此您可能希望将函数签名更改为 (limit, callback) 并相应地调整调用代码。

【讨论】:

    【解决方案2】:

    我发现了问题所在。我没有将猫鼬正确设置为客户端,因此在引用导出的代码以查找图书数据时没有发生任何事情。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-08
      • 1970-01-01
      • 2013-10-20
      • 1970-01-01
      • 1970-01-01
      • 2014-05-06
      • 1970-01-01
      • 2020-12-29
      相关资源
      最近更新 更多