мне нужно запустить команду npm npm install express mongoose cors
затем я запускаю базу данных StudentRecords со студентом коллекции, имеющим следующие данные
db.students.insertMany({id:1},{name:'Джон'},{id:2,name:'Доу'});
Я хочу отображать эти данные в своем веб-браузере только с помощью Express, как я это сделал в приведенном ниже коде, но он отображает ошибки (т. е. не извлекает какие-либо данные из базы данных), как исправить код, чтобы он мог работать правильно?
const express = require('express');
const mongoose = require('mongoose');
const cors = require('cors');
const app = express();
const port = process.env.PORT || 3000;
// Middleware
app.use(cors());
app.use(express.json());
// MongoDB connection
mongoose.connect('mongodb://localhost:27017/mydatabase', {
useNewUrlParser: true,
useUnifiedTopology: true
});
// Schema and model
const Schema = mongoose.Schema;
const DataSchema = new Schema({
name: String
});
const Data = mongoose.model('Data', DataSchema);
// Route to fetch data by name and id
app.get('/data/', async (req, res) => {
try {
const { name } = req.params;
const data = await Data.find({ name: name }, { _id: 0, name: 1 });
if (!data || data.length === 0) {
return res.status(404).send('Data not found');
}
res.json(data);
} catch (err) {
console.error('Failed to fetch data', err);
res.status(500).send('Internal Server Error');
}
});
// Start server
app.listen(port, () => {
console.info(`Server running at http://localhost:${port}/`);
});
🤔 А знаете ли вы, что...
JavaScript - это скриптовый язык программирования, разработанный Netscape Communications Corporation.
В принципе ваш код хорошо настроен.
Я попробовал то же самое, и это привело к желаемому результату ниже. В следующем посте объясняется несколько исправлений, которые необходимо внести, чтобы ваш код полностью работал. Пожалуйста, попробуйте и для получения разъяснений, если они потребуются от меня, оставьте свои комментарии.
Тестирование в браузере:
Request URL : http://localhost:3000/data/John
Response :
[
{
"name": "John"
}
]
Прилагаю несколько замечаний и комментариев:
пункт 1:
«…затем я запускаю базу данных StudentRecords с коллекцией Student, имеющей следующие данные db.students.insertMany({id:1},{name:'John'},{id:2,name:'Doe'});...»
наблюдения и комментарии:
Согласно примечанию выше,
database name : studentsRecords
collection name : students // Please note it is not just student alone, s is also suffixed.
Теперь мы создадим документы, как показано ниже:
Предварительные требования: база данных должна указывать на базу данных StudentRecords, а оператор InsertMany должен ссылаться на коллекцию Student. Соответствующие коды приведены ниже.
// start mongo shell
command prompt>mongosh
// check the list of available databases
mongosh prompt>show dbs
// switch to the database studentsRecords
mongosh prompt>use studentsRecords
// create the documents, please note there should be a set of curly braces to separate each document.
mongosh prompt>db.students.insertMany({id:1,name:'John'},{id:2,name:'Doe'});
// check and verify the documents are created as desired
mongosh prompt>db.students.find();
[
{ _id: ObjectId('6672396e2241632216628d55'), id: 1, name: 'John' },
{ _id: ObjectId('6672396e2241632216628d56'), id: 2, name: 'Doe' }
]
пункт 2:
// соединение с MongoDB mongoose.connect('mongodb://localhost:27017/mydatabase', {useNewUrlParser: true, useUnifiedTopology: true });
Комментарии:
База данных, указанная в строке подключения, должна быть исправлена в соответствии с обсуждениями, которые мы провели в пункте 1. Поэтому исправленный оператор будет таким, как показано ниже. Обратите внимание, что два ключа useNewUrlParser и useUnifiedTopology, переданные в объект параметров, теперь устарели, поэтому теперь они опущены.
…
mongoose.connect('mongodb://localhost:27017/studentsRecords);
…
пункт 3:
… const Data = mongoose.model('Data', DataSchema); …
Комментарии:
Имя коллекции, переданное в модель метода, необходимо изменить с «Данные» на «Студент», это опять же соответствует обсуждению, которое мы провели в пункте 1. Также обратите внимание, что это должно быть единственное имя, поэтому это «студент», а не «студенты». Mongoose автоматически ищет свое имя во множественном числе. Исправленный код приведен ниже:
const Data = mongoose.model(student, DataSchema);
пункт 4:
// Маршрут для получения данных по имени и идентификатору app.get('/data/', async (req, res) => {
Комментарии:
Путь маршрута /data/ также должен иметь префикс параметра маршрута. Это необходимо для получения соответствующего значения, указанного в URL-адресе запроса. Исправленный код приведен ниже.
…
app.get('/data/:name’, async (req, res) => {...
Полный листинг исправленного кода:
const express = require('express');
const mongoose = require('mongoose');
const cors = require('cors');
const app = express();
const port = process.env.PORT || 3000;
// Middleware
app.use(cors());
app.use(express.json());
// MongoDB connection
mongoose.connect('mongodb://localhost:27017/studentsRecords');
// Schema and model
const Schema = mongoose.Schema;
const DataSchema = new Schema({
name: String,
});
const Data = mongoose.model('student', DataSchema);
// Route to fetch data by name and id
app.get('/data/:name', async (req, res) => {
try {
const { name } = req.params;
const data = await Data.find({ name: name }, { _id: 0, name: 1 });
if (!data || data.length === 0) {
return res.status(404).send('Data not found');
}
res.json(data);
} catch (err) {
console.error('Failed to fetch data', err);
res.status(500).send('Internal Server Error');
}
});
// Start server
app.listen(port, () => {
console.info(`Server running at http://localhost:${port}/`);
});
Версия 2 кода: добавлен новый путь маршрута для всех.
const express = require('express');
const mongoose = require('mongoose');
const cors = require('cors');
const app = express();
const port = process.env.PORT || 3000;
// Middleware
app.use(cors());
app.use(express.json());
// MongoDB connection
mongoose.connect('mongodb://localhost:27017/test');
// Schema and model
const Schema = mongoose.Schema;
const DataSchema = new Schema({
name: String,
});
const Data = mongoose.model('student', DataSchema);
// Route to fetch all
// IMPORTANT : keep this route path always on top of the other route path '/data/:name'
// else retrieval will fail.
app.get('/data/all', async (req, res) => {
try {
const data = await Data.find({}, { _id: 0, name: 1 });
if (!data || data.length === 0) {
return res.status(404).send('Data not found');
}
res.json(data);
} catch (err) {
console.error('Failed to fetch data', err);
res.status(500).send('Internal Server Error');
}
});
// Route to fetch data by name and id
app.get('/data/:name', async (req, res) => {
try {
const { name } = req.params;
const data = await Data.find({ name: name }, { _id: 0, name: 1 });
if (!data || data.length === 0) {
return res.status(404).send('Data not found');
}
res.json(data);
} catch (err) {
console.error('Failed to fetch data', err);
res.status(500).send('Internal Server Error');
}
});
// Start server
app.listen(port, () => {
console.info(`Server running at http://localhost:${port}/`);
});