У меня есть два 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 методы, обеспечивающие выполнение каждой операции перед переходом к следующей задаче. Если это так, то я не совсем уверен, как применить его к моему коду.