Экспорт кода Mon goose в Node.js - передать значение для обратного вызова из метода Mon goose - PullRequest
0 голосов
/ 18 апреля 2020

У меня есть два JS файла: app.js, который имеет обработчики методов HTTP API, и model.js, который содержит методы Mon goose (MongoDB), которые будут вызываться / потребляться HTTP app.js методы. Раньше, когда у меня был весь мой код в одном файле (app.js), он работал отлично. Но когда я разделил его на код Mon goose по отдельности, у меня возникла ошибка.

Концепция веб-сайта такова: он отображает контрольный список задач с заголовком списка "Today's". Таким образом, в базе данных есть модель List, которая имеет поле / свойство name и массив полей / свойств items (элементы контрольного списка).

Идея заключается в том, когда веб-сайт загружается , на домашней странице отображается список задач Today's. Он делает это, сначала проверяя в базе данных, если есть объект List с именем Today's, он отображает его на домашней странице, в противном случае он создает этот объект List, вызывая методы в файле model.js, перед отображением домашней страницы. ,

Итак, шаги:

1- В app.js, вызов метода app.get('/' ... List.findOne Пн goose метод в model.js, чтобы сначала проверить, если Today's Объект списка существует в базе данных.

2 - Если List.findOne находит Today's объект списка, мне нужно передать Today's объект списка в callback, чтобы он мог быть получен в методе app.get('/'..., который, в свою очередь, будет использовать это сделать главную страницу.

3 - Однако, если List.findOne не находит Today's объект списка, тогда мне нужно передать что-то еще обратно в callback, например, ноль, строку "null" или что-то еще, чтобы указать, что Объект списка Today's не найден. Таким образом, метод app.get('/'... получит что-то в callback, которое указывает «список не найден» и вызовет другой метод Mon goose для создания Today's объекта списка.

Однако я просто получаю ошибка вместо возможности передать что-либо в callback:

ошибка:

[nodemon] starting `node app.js`
Server started, listening on port: 3000
list not found
events.js:288
      throw er; // Unhandled 'error' event
      ^

ReferenceError: _ is not defined
    at Function.createNewListInDB (C:\Users\hazzaldo\Desktop\...\todolist-v2\model.js:72:29)
    at C:\Users\hazzaldo\Desktop\...\todolist-v2\app.js:22:23
    at C:\Users\hazzaldo\Desktop\...\todolist-v2\model.js:38:17
    at C:\Users\hazzaldo\Desktop\...\todolist-v2\node_modules\mongoose\lib\model.js:4849:16
    at C:\Users\hazzaldo\Desktop\...\todolist-v2\node_modules\mongoose\lib\model.js:4849:16
    at C:\Users\hazzaldo\Desktop\...\todolist-v2\node_modules\mongoose\lib\helpers\promiseOrCallback.js:24:16
    at C:\Users\hazzaldo\Desktop\...\todolist-v2\node_modules\mongoose\lib\model.js:4872:21
    at C:\Users\hazzaldo\Desktop\...\todolist-v2\node_modules\mongoose\lib\query.js:4379:11
    at C:\Users\hazzaldo\Desktop\...\todolist-v2\node_modules\kareem\index.js:135:16
    at processTicksAndRejections (internal/process/task_queues.js:79:11)
Emitted 'error' event on Function instance at:
    at C:\Users\hazzaldo\Desktop\...\todolist-v2\node_modules\mongoose\lib\model.js:4851:13
    at C:\Users\hazzaldo\Desktop\...\todolist-v2\node_modules\mongoose\lib\helpers\promiseOrCallback.js:24:16
    [... lines matching original stack trace ...]
    at processTicksAndRejections (internal/process/task_queues.js:79:11)
[nodemon] app crashed - waiting for file changes before starting...

Вот мой код:

model.js:

const mongoose = require('mongoose');

//create DB
mongoose.connect('mongodb://localhost:27017/todolistDB', {useNewUrlParser: true, useUnifiedTopology: true, useFindAndModify: false });


//create schema
const itemsSchema = new mongoose.Schema ({
  name: String
});

const listSchema = new mongoose.Schema ({
  name: String,
  items: [itemsSchema]
});


//create model (aka Collection) (equivalent to Table in SQL))
const Item = mongoose.model('Item', itemsSchema);
const List = mongoose.model('List', listSchema);


class DBUtility {
    constructor() {
        console.log("Constructor class DBUtility");
    }

    // *** DB utility methods

    static findOneList(listName, callBack) {

        List.findOne({name: listName}, (err, foundList) => {
            if (err) {
                console.log(`Error: ${err}`);
            } else if (!foundList) {
                console.log('list not found');
                const value = 'null'
                callBack(value);   
            } else {
                console.log(`found list.`);
                callBack(foundList)
            }
        });
    }

    static createNewListInDB(listName) {
        //create default items for new list
        const introItem = new Item({
            name: 'Welcome to your todolist!'
        });

        const addItem = new Item({
            name: 'Hit the + button to add a new item.'
        });

        const deleteItem = new Item({
            name: '<-- Hit this to delete an item.'
        });

        const listNameCap = _.capitalize(listName);
        const list = new List({
            name: listNameCap,
            items: [introItem, addItem, deleteItem]
        });
        list.save(err => {
            if (err) return handleError(err);
            console.log(`List ${list} added successfully to DB.`);
        });
    }

}

exports.DBUtility = DBUtility;

app.js:

const express = require('express');
const bodyParser = require('body-parser');
const date = require(`${__dirname}\\date.js`);
const model = require(`${__dirname}\\model.js`);
const ejs = require('ejs');
const _ = require('lodash');

const app = express();

app.use(bodyParser.urlencoded({ extended: true }));
app.set('view engine', 'ejs');
app.use(express.static('public'));


//*** HTTP requests handlers

app.get('/', (req, res) => {
  const defaultListName = "Today's";
  const todayFormatted = date.getDate();
  model.DBUtility.findOneList(defaultListName, (foundList) => {
    if (foundList === 'null') {
      model.DBUtility.createNewListInDB(defaultListName);
      res.redirect('/');
    } else { 
      res.render('list', {
        listTitlePassToH1: foundList.name,
        todayDate: todayFormatted,
        listItems: foundList.items
      });
    }
  });
});

const port = 3000;
app.listen(port, () => {
  console.log(`Server started, listening on port: ${port}`);

Я смотрел другие подобные посты на SO, и не уверен, что это решает аналогичную проблему с моей, но в одном посте предлагается использовать Promise на всех Mon goose методы, обеспечивающие выполнение каждой операции перед переходом к следующей задаче. Если это так, то я не совсем уверен, как применить его к моему коду.

1 Ответ

1 голос
/ 18 апреля 2020

Я не уверен, что это сработает, но я сталкивался с этой проблемой раньше. Попробуйте указать loda sh в вашем файле model.js: const _ = require("lodash");.

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