при запуске программы expres появляется страница с ошибкой загрузки - PullRequest
0 голосов
/ 30 апреля 2018
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 голосов
/ 30 апреля 2018

Когда запрос выполняется, результаты передаются в качестве параметров в функцию обратного вызова. Если при выполнении запроса есть какая-либо ошибка, она передается в качестве первого аргумента, а результаты передаются в качестве второго параметра в функцию обратного вызова. И вот как это работает.

Итак, вы не можете использовать его взаимозаменяемо.

В вашем случае books.getBooks(function (books,err) {.., если есть какая-либо ошибка, будет books, содержащаяся в ней. И если нет, то будут результаты в err параметрах.

И я предполагаю, что ваш запрос работает нормально, а вы запускаете проверку ошибок для значения err, поэтому вы видите ошибку.

Может быть, вы путаетесь с названиями параметров. Помните, они просто имена переменных, результаты там в соответствии с положением переменных в обратном вызове.

0 голосов
/ 01 мая 2018

Ответить на ваш вопрос по:

Почему мы не можем использовать function(err, books) как function(books, error).

Большинство npm модулей следуют шаблону Стиль продолжения передачи (CPS) , который использует:

  1. cb(null, data), чтобы передать успешный результат.
  2. cb(err) для передачи ошибки и выхода из функции.
  3. и функция имеет только один результат.

Например:

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 : Это, друг мой, условно.

0 голосов
/ 30 апреля 2018

Единственное, о чем я могу думать, не зная об ошибке, это то, что вы можете захотеть использовать:

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

И ваша модель должна называться Books.

Можно ли включить сообщение Error и Model, чтобы мы могли получить больше информации о проблеме?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...