运行expres程序时获取加载错误页面

时间:2018-04-30 17:12:17

标签: mongodb express

var express = require('express');
var app = express();
var bodyparser = require('body-parser');
var mongoose = require('mongoose');
books =  require('./models/books.js');

mongoose.connect('mongodb://localhost/books');
var db = mongoose.connection;

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

    });
});

为什么我们无法将function(err, books)用作function(books, error)

我想知道它违反了什么原则。

3 个答案:

答案 0 :(得分:0)

在不知道错误的情况下,我唯一能想到的就是你可能想要使用:

let books = mongoose.model ('Books');

您的模型应该被称为Books

是否可以添加Error消息和Model,以便我们可以获得有关此问题的更多信息?

答案 1 :(得分:0)

执行查询时,结果作为参数传递给回调函数。如果在执行查询时出现任何错误,则将错误作为第一个参数传递,并将结果作为第二个参数传递给回调函数。这就是它的工作原理。

所以,你不能互换使用它。

在您的案例books.getBooks(function (books,err) {..中,如果有任何错误books将包含在其中。如果没有,err参数会产生结果。

我认为您的查询工作正常,并且您正在对err值进行错误检查,这就是您看到错误的原因。

你可能会对params的名字感到困惑。记住,它们只是变量名,结果是根据回调中变量的位置。

答案 2 :(得分:0)

回答你的问题:

  

为什么我们无法将function(err, books)用作function(books, error)

大多数npm模块遵循延续传递样式(CPS)设计模式,该模式使用:

  1. cb(null, data)传递成功的结果。
  2. cb(err)传递错误并退出该功能。
  3. 并且,该功能只有一个结果。
  4. 例如:

    function getBooks(cb) {
        let books, error;
        // .... Perform the operations
        // .... If all goes well store
        // .... the results in books
    
        if (books) {
            cb(null, result);
        } else {
            error = "There was an error loading books"
            cb(error)
        }
    }
    

    这不是一个完整的例子,但展示了它的本质。

    TL; DR :我的朋友,那就是惯例。