19.11.2019, 17:53
|
Новичок на форуме
|
|
Регистрация: 19.11.2019
Сообщений: 2
|
|
mongodb работа с базой через node и напрямую
Всем привет!
Вникаю в node.js и mongodb.
1. Поднял на Ubuntu Server 18.04: node.js, express, mongodb.
2. Создал базу test_base и коллекцию rates в ней.
3. Настроил маршруты для get/post/delete
Через POST передаю документ, проверяю через GET - добавился, все вроде ОК, ноооо...
Открываю на сервере mongo --shell, проверяю в той же коллекции той же базы - пусто. Пишу через post в новую коллекцию, проверяю GET-ом - запись есть в новой коллекции, а в mongo --shell коллекция новая не появилась.
Подскажите, как посмотреть наполнение базы на сервере и почему я не вижу наполнения в mongo --shell?
Чувствую что ответ лежит на поверхности и я просто где-то не вник, но уже три дня не могу понять куда смотреть и как найти решение(
Содержимое server.js:
const express = require('express');
const MongoClient = require('mongodb').MongoClient;
const bodyParser = require('body-parser');
const app = express();
const port = 8000;
var db;
MongoClient.connect('mongodb://localhost:27017/',function(err, database){
if(err)
{
return console.log(err);
}
db=database.db('test_base');
app.listen(3012,function(){
console.log('api app started')
});
});
app.use(bodyParser.urlencoded({extended : true}));
app.listen(port, () =>{
console.log('We are live on port '+port);
});
app.get('/', function(req, res){
res.sendfile('/media/share/index.html');
});
app.get('/rates', function(req, res){
res.sendfile('/media/share/rates.csv');
});
app.post('/rates_post', (req, res) => {
var rate={
name:req.body.name,
billing_name:req.body.bilname,
cost:req.body.cost
};
db.collection('crowd').insertOne(rate, function(err, resault){
if(err)
{
console.log(err);
return res.sendStatus(500);
}
res.send(resault);
});
});
app.get('/base', function(req, res){
db.collection('rates').find().toArray(function(err, docs){
if(err)
{
console.log(err);
return res.sendStatus(500);
}
res.send(docs);
})
});
app.post('/parse', (req, res) => {
var rate={
name:req.body.name,
bilname:req.body.bilname,
cost:req.body.cost,
service:req.body.service,
technology:req.body.technology,
sity:req.body.city,
service_package:req.body.service_package,
};
db.collection('rates').insertOne(rate, function(err, resault){
if(err)
{
console.log(err);
return res.sendStatus(500);
}
res.send(resault);
});
});
app.delete('/del_all', (req, res) => {
db.collection('rates').deleteMany({}, function(err, resault){
if(err)
{
console.log(err);
return res.sendStatus(500);
}
res.send(resault);
});
});
|
|
19.11.2019, 18:48
|
Профессор
|
|
Регистрация: 28.04.2017
Сообщений: 214
|
|
app.post('/rates_post', function(req, res) {
var rate={
name: req.body.name,
billing_name: req.body.bilname,
cost: req.body.cost
};
MongoClient.connect('mongodb://localhost:27017/', function(err, client) {
if(err) console.log(err);
var coll = client.db('test_base').collection('crowd');
coll.insertOne(rate, function(){
coll.findOne({name: rate.name}, function(err, doc) {
if(err) console.log(err);
client.close();
res.json(doc);
});
});
});
});
Последний раз редактировалось Audaxviator, 19.11.2019 в 19:19.
|
|
19.11.2019, 21:41
|
Профессор
|
|
Регистрация: 28.04.2017
Сообщений: 214
|
|
Ладно, в общем, расскажу кое-чего за эту тему. А чем ещё заняться безработному предпенсионеру?
Короче так. С тех пор, как появился пресловутый express.Router(), все уж и забыли, во-перввых, как просто делаются роутеры, и во-вторых, как работать с нативным драйвером mongodb.
Тут дело в чём? Вот к примеру, для Go кто-то написал, наконец-то, пакет context - и наступило счастье: там теперь появился сносный фреймвёрк go-chi/chi, сильно похожий (ну, насколько возможно) на ruby-rails или Express, появился пакет go-socket.io, прям юзающий стандартный модуль socket.io.js на клиенте, - в общем, кое-что появилось.
Но в Експрессе-то этот самый "контекст" был всегда. Только назывался он - app.locals.
Понятно, что коннект к базе - "дорогая" операция, поэтому мы хочим поключиться, держать открытым соединение и не париться. Делалось это так:
...
...
...
var MongoClient = require('mongodb').MongoClient;
...
app.get...
app.post...
app...
app...
...
MongoClient.connect('mongodb://localhost:27017/', function(err, client) {
if(err) console.log(err);
app.locals.db = client.db('anybase');
app.listen(3000, function() {
console.log('3000');
});
});
И вуаля!
Теперь все обработчики начинаются с магической строчки
var clientDB = app.locals.db;
clientDB.collection('blabla').find(...
Извените за внимание.
Последний раз редактировалось Audaxviator, 19.11.2019 в 21:49.
|
|
20.11.2019, 15:06
|
Новичок на форуме
|
|
Регистрация: 19.11.2019
Сообщений: 2
|
|
Сообщение от Audaxviator
|
Ладно, в общем, расскажу кое-чего за эту тему. А чем ещё заняться безработному предпенсионеру?
Короче так. С тех пор, как появился пресловутый express.Router(), все уж и забыли, во-перввых, как просто делаются роутеры, и во-вторых, как работать с нативным драйвером mongodb.
Тут дело в чём? Вот к примеру, для Go кто-то написал, наконец-то, пакет context - и наступило счастье: там теперь появился сносный фреймвёрк go-chi/chi, сильно похожий (ну, насколько возможно) на ruby-rails или Express, появился пакет go-socket.io, прям юзающий стандартный модуль socket.io.js на клиенте, - в общем, кое-что появилось.
Но в Експрессе-то этот самый "контекст" был всегда. Только назывался он - app.locals.
Понятно, что коннект к базе - "дорогая" операция, поэтому мы хочим поключиться, держать открытым соединение и не парить...
|
Но это все не поясняет суть проблемы - почему я вижу наличие записей в свой базе через GET, но не могу посмотреть в оболочке mongo?
Куда они пишутся? Как со стороны сервера увидеть наполнение базы?)
|
|
20.11.2019, 16:02
|
Профессор
|
|
Регистрация: 28.04.2017
Сообщений: 214
|
|
Это чудо!!!
Можно попробовать писать в терминале правильные команды ( вот тут есть).
Заходишь в папку с бинарниками, и первая команда
mongo
вторая
show dbs
третья
use <имя базы из имеющегося списка>
следующая
db.getCollectionNames()
и т.д.
Я всегда так делаю.
|
|
|
|