我已经阅读了一些关于如何将Mongo与Node一起使用的指南,它们似乎都以不同方式连接到数据库。一个对我有用的特别方式是:
MongoClient.connect("mongodb://localhost:27017/exampleDb", function(err, db) {
if(err) { return console.dir(err); }
db.createCollection('users', function(err, collection) {});
//Do all server/database operations in here
});
然而,这对我来说似乎效率低/奇怪,每次有app.get()
时我都必须重新连接到数据库,就像创建新用户或检索信息一样。
另一种似乎更适合我的方式是
var mongoose = require("mongoose")
var db = mongoose.connect("localhost:27107/users");
db.createCollection('users', function(err, collection) {});
我已经看到有几个网站在这些方面做了些什么,但我个人无法通过以上方式开展工作。我一直收到错误TypeError: db.createCollection is not a function
服务器端。所以,我的问题是为什么上面的代码不起作用,如果第一个代码是一个很好的选择,并且还有其他方法可以做到这一点。
答案 0 :(得分:11)
您可以使用全局变量来保存连接(例如db
),例如:
var db = null // global variable to hold the connection
MongoClient.connect('mongodb://localhost:27017/', function(err, client) {
if(err) { console.error(err) }
db = client.db('test') // once connected, assign the connection to the global variable
})
app.get('/', function(req, res) {
db.collection('test').find({}).toArray(function(err, docs) {
if(err) { console.error(err) }
res.send(JSON.stringify(docs))
})
})
或者,如果您愿意,还可以使用MongoClient
返回的 Promise对象(如果在没有回调参数的情况下调用它):
var conn = MongoClient.connect('mongodb://localhost:27017/') // returns a Promise
app.get('/', function(req, res) {
conn.then(client=> client.db('test').collection('test').find({}).toArray(function(err, docs) {
if(err) { console.error(err) }
res.send(JSON.stringify(docs))
}))
})
请注意,我在第二个示例中使用了ES6 fat arrow function definition。
你绝对不应该每次都致电MongoClient
。使用全局变量或Promises允许MongoDB node.js驱动程序创建一个连接池,它至少可以实现两个好处:
编辑2018-08-24 :node.js驱动程序版本3.0及更高版本中的MongoClient.connect()
方法返回client object而不是数据库对象。修改了上面的示例,以使其与最新的node.js驱动程序版本保持同步。
答案 1 :(得分:0)
你可以这样使用它:
该server.js文件:
import path from 'path'
import express from 'express'
import bodyParser from 'body-parser'
import morgan from 'morgan'
import db from './server/database'
import routes from './server/routes'
import webpack from 'webpack'
import webpackDevMiddleware from 'webpack-dev-middleware'
import webpackHotMiddleware from 'webpack-hot-middleware'
import webpackConfig from './config/webpack'
const app = express()
const port = process.env.PORT || process.env.NODE_PORT
const compiler = webpack(webpackConfig)
db(λ => {
app.use(webpackDevMiddleware(compiler, { noInfo: true, publicPath: webpackConfig.output.publicPath }))
app.use(webpackHotMiddleware(compiler))
app.use(morgan('dev'))
app.use(bodyParser.json({ limit: '20mb' }))
app.use(bodyParser.urlencoded({ limit: '20mb', extended: false }))
app.use('/static', express.static('static'));
//app.use('/api', jwt)
app.use('/api', routes())
app.set('json spaces', 2)
app.get('*', function(request, response) {
response.sendFile(path.resolve(__dirname, 'index.html'))
})
app.listen(port, (error) => {
if (error) {
console.error(error)
throw error
} else {
console.info(`==> Listening on port ${port}. Open up http://localhost:${port}/ in your browser.`)
}
})
})
服务器/ database.js
import mongoose from 'mongoose'
export default callback => {
const { MONGO_URL, MONGO_PORT, MONGO_DB } = process.env
mongoose.connect(`mongodb://${MONGO_URL}:${MONGO_PORT}/${MONGO_DB}`, error => {
if (error) {
console.error('Please make sure your MongoDB configuration is correct and that service is running')
throw error
}
})
callback()
}
然后你必须定义你的猫鼬模型,例如:
import mongoose, { Schema } from 'mongoose'
const ideaSchema = new Schema({
title: {
type: String,
required: true
},
slug: {
type: String,
required: true,
unique: true
},
description: {
type: String,
required: true
}
})
export default mongoose.model('Idea', ideaSchema)
只需以这种方式使用控制器:
import HttpStatus from 'http-status-codes'
import mongoose from 'mongoose'
import sanitize from 'sanitize-html'
import slug from 'slug'
import Idea from '../models/idea'
const findAllIdeas = (req, res) => {
Idea.find()
.select('user title slug createdAt updatedAt')
.populate({
path: 'user',
select: 'firstName lastName'
})
.then(data => res.status(HttpStatus.OK).json(data))
.catch(error => res.status(HttpStatus.BAD_REQUEST).json(error))
}
export default { findAllIdeas, findIdeaBySlug, createIdea, addComment }
您不必为每个获取请求连接到mongoDB。
所以你的路线看起来就像那样。非常简单:
import { Router } from 'express'
import controller from '../controllers/idea'
const router = Router()
router.route('/')
.get(controller.findAllIdeas)
.post(controller.createIdea)
router.route('/:slug')
.get(controller.findIdeaBySlug)
router.route('/comment')
.post(controller.addComment)
export default router
答案 2 :(得分:0)
我已经编写了一个关于如何在express中重用mongodb连接的教程。你可以看到GoogleGroups。基本上,它是一个简单的模块,您可以使用这样的表达式:
var connection = require('./dbconnection');
// url and optional config.
app.use(connection(app, 'mongourl', {});
这里是连接的代码:
module.exports = function(app, uri, opts) {
if (typeof uri !== 'string') {
throw new TypeError('Error: Unexpected mongodb connection url');
}
opts = opts || {};
var property = opts.property || 'db';
var connection;
return function expressMongoDb(req, res, next) {
if (!connection) {
connection = MongoClient.connect(uri, opts);
}
connection
.then(function (db) {
req[property] = db;
app.set('mongodb', db);
next();
})
.catch(function (err) {
connection = undefined;
next(err);
});
};
};
答案 3 :(得分:-1)
我的首选代码如下:
mongoose.connect(YOUR_URL ,function(err) {
if (err) {
console.log(err);
}else{
console.log("Connected to DB");
}
});
还可以尝试连接到localhost:27107
,这可能是您的问题。