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)
。
我想知道它违反了什么原则。
答案 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)设计模式,该模式使用:
cb(null, data)
传递成功的结果。 cb(err)
传递错误并退出该功能。例如:
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 :我的朋友,那就是惯例。