急【新手求教】Nodejs和MongoDB在BAE上搭建网站问题 有没有在BAE用Node.js和MongoDB 搭建网站的,为啥本我的程序在本地运行很好,就是部属到BAE上不成功。
急【新手求教】Nodejs和MongoDB在BAE上搭建网站问题 有没有在BAE用Node.js和MongoDB 搭建网站的,为啥本我的程序在本地运行很好,就是部属到BAE上不成功。
本人也是前端爱好者,最近在用Node.js和MongoDB搭建自己的网站,本地运行很好。
按照BAE上修改链接方式后,访问网站出错,提示:
可以访问 http://siblim.duapp.com/ 查看错误如下 Error: Error connecting to database: failed to connect to [127.0.0.1:27017] at null. (/home/bae/app/node_modules/connect-mongo/node_modules/mongodb/lib/mongodb/connection/server.js:553:74) at EventEmitter.emit (events.js:106:17) at null. (/home/bae/app/node_modules/connect-mongo/node_modules/mongodb/lib/mongodb/connection/connection_pool.js:140:15) at EventEmitter.emit (events.js:98:17) at Socket. (/home/bae/app/node_modules/connect-mongo/node_modules/mongodb/lib/mongodb/connection/connection.js:512:10) at Socket.EventEmitter.emit (events.js:95:17) at net.js:441:14 at process._tickCallback (node.js:415:13)
但是本地链接代码,个人已经修改了。怎么还会链接failed to connect to [127.0.0.1:27017]
//db.js 链接代码修改如下 var Db = require(‘mongodb’).Db; var Connection = require(‘mongodb’).Connection; var Server = require(‘mongodb’).Server; //数据库连接信息host,port,user,pwd var db_name = ‘MOOEovYoNmLKlMCIfRdt’; // 数据库名,从云平台获取 var db_host = ‘mongo.duapp.com’; // 数据库地址 var db_port = ‘8908’; // 数据库端口 var username = ‘。。。’; // 用户名(API KEY) var password = ‘。。。’; // 密码(Secret KEY)
module.exports = new Db(db_name, new Server(db_host, db_port, {}), {w: 1});
//post.js 调用代码如下 var mongodb = require(’./db’); var moment = require(‘moment’);//时间模块 var formidable = require(“formidable”);//处理POST数据模块
function Post(username, post, target_path, time){ this.user = username; this.post = post; this.img = target_path; if (time) { this.time = time; }else{ this.time = new moment().format(“YYYY-MM-DD HH:mm:ss”); //console.log(moment().format()); }
}; module.exports = Post;
Post.prototype.save = function save(callback) {
// 存入 MongoDB的文档
var post = {
user: this.user,
post: this.post,
img: this.img,
time: this.time,
};
mongodb.open(function(err,db){
if(err) return callback(err);
//读取post集合
db.authenticate("。。。", “。。。”, function(err, result) {
if (err) {
db.close();
console.log(err);
return;
}
db.collection(‘posts’,function(err, collection){
if (err) {
mongodb.close();
return callback(err);
};
//为user属性添加索引
collection.ensureIndex(‘user’);
//写入post文档
collection.insert(post, {safe: true}, function(err, post){
mongodb.close();
callback(err, post);
});
});
});
});
};
Post.get = function get(username, callback){
mongodb.open(function(err, db){
if (err) {return callback(err)};
db.authenticate("。。。", “。。。”, function(err, result) {
if (err) {
db.close();
console.log(err);
return;
}
db.collection(‘posts’, function(err, collection){
if(err) {
mongodb.close();
return callback(err);
};
//查找user属性为username的文档,如果username是null则匹配全部
var query = {};
if (username) {
query.user = username;
};
collection.find(query).sort({time: -1}).limit(30).toArray(function(err, docs){
mongodb.close();
if(err) {
callback(err,null);
};
//封装posts为post对象
var posts = [];
docs.forEach(function(doc, index){
var post = new Post(doc.user, doc.post, doc.img,doc.time);
posts.push(post);
});
callback(null,posts);
});
});
});
});
}
根据你提供的信息,你的应用在本地运行良好,但在部署到百度应用引擎(BAE)时遇到数据库连接问题。这通常是因为配置或环境差异导致的。以下是可能的原因及解决方案:
1. 配置问题
确保你在BAE上的配置正确。你提到的数据库连接字符串看起来是正确的,但你需要确认用户名和密码是否正确,并且是否需要进行身份验证。
2. 环境差异
BAE的环境与本地环境可能有所不同,特别是在网络配置方面。确保你的数据库连接字符串指向的是BAE提供的MongoDB服务。
示例代码
修改 db.js
确保你的数据库连接配置正确,并且使用了环境变量来存储敏感信息。
const MongoClient = require('mongodb').MongoClient;
const db_name = process.env.MONGODB_DB_NAME || 'your_db_name';
const db_host = process.env.MONGODB_HOST || 'mongo.duapp.com';
const db_port = process.env.MONGODB_PORT || '8908';
const username = process.env.MONGODB_USERNAME || 'your_username';
const password = process.env.MONGODB_PASSWORD || 'your_password';
const url = `mongodb://${username}:${password}@${db_host}:${db_port}/${db_name}`;
module.exports = MongoClient.connect(url, { useNewUrlParser: true, useUnifiedTopology: true });
修改 post.js
确保在调用数据库操作时正确地处理连接。
var db = require('./db');
var moment = require('moment'); // 时间模块
var formidable = require("formidable"); // 处理POST数据模块
function Post(username, post, target_path, time) {
this.user = username;
this.post = post;
this.img = target_path;
if (time) {
this.time = time;
} else {
this.time = new moment().format("YYYY-MM-DD HH:mm:ss");
}
};
module.exports = Post;
Post.prototype.save = function save(callback) {
var post = {
user: this.user,
post: this.post,
img: this.img,
time: this.time,
};
db.then((client) => {
const db = client.db(db_name);
const collection = db.collection('posts');
collection.insertOne(post, { safe: true }, (err, result) => {
client.close();
callback(err, result.ops[0]);
});
}).catch((err) => {
callback(err, null);
});
};
Post.get = function get(username, callback) {
db.then((client) => {
const db = client.db(db_name);
const collection = db.collection('posts');
let query = {};
if (username) {
query.user = username;
}
collection.find(query).sort({ time: -1 }).limit(30).toArray((err, docs) => {
client.close();
if (err) {
callback(err, null);
return;
}
let posts = [];
docs.forEach((doc) => {
let post = new Post(doc.user, doc.post, doc.img, doc.time);
posts.push(post);
});
callback(null, posts);
});
}).catch((err) => {
callback(err, null);
});
};
总结
- 确保所有环境变量都已正确设置。
- 使用环境变量存储敏感信息。
- 确保数据库连接字符串指向的是BAE提供的MongoDB服务。
- 在代码中使用
Promise
或async/await
来处理异步操作,以提高代码可读性和健壮性。
希望这些修改能帮助你解决问题。如果仍有问题,请检查BAE的日志输出,以获取更多详细的错误信息。
数据库的地址要改为bae的mongodb提供给你的地址。还有,bae的mongo貌似不支持长连接
bae提供的地址就是mongo.duapp.com,官方连接方式就是长连接的
我用的很正常,这个明显是你的bae上配置不正常,连的依然是127.0.0.1 我现在更喜欢node.js了,同样的功能我的上一个原型使用的python+django+mysql,现在使用node.js+express+monogoose。node.js版本可以支持250个模拟并发,而以前只支持50个不到
谢谢啦。我是新手,可不可以把您部分的app.js代码,数据库连接代码,和少量数据库代码贴给我看看,学习学习…
非常感谢。。。
遇到了和楼主一样的问题。请问楼主你这个问题怎么解决?
===================== 这个问题解决了。是一位内在使用connect-mongo来做存储session的时候,也需要链接数据库。这里需要填入你的配置。
但是同时,出现了新的问题。正在解决当中。
感谢,我也是新手,以后多多交流~~ 我的问题还没解决,正在弄~~
对的,是你说的问题,我也解决了。但是遇到了 访问的时候 无法加载,是不是 百度服务器的问题。。
一般这种环境都是不支持长连接的
你看看这篇文章,我就是按照这篇文章解决的! http://cnodejs.org/topic/53be80a229bac3c80f09d6a9
根据你的描述,问题可能在于如何正确配置MongoDB的连接信息以适应BAE环境。在BAE(百度应用引擎)上部署Node.js应用时,需要确保使用正确的MongoDB连接字符串。以下是一些可能的原因和解决方案:
-
连接字符串格式:确保你在代码中使用的MongoDB连接字符串格式正确。在BAE环境中,你通常会从环境变量中获取这些信息。
-
环境变量:在BAE上,你需要从环境变量中读取数据库的连接信息,而不是硬编码。
以下是修改后的代码示例:
// db.js
const MongoClient = require('mongodb').MongoClient;
let db = null;
function connectDb() {
const uri = `mongodb://${process.env.MONGO_USER}:${process.env.MONGO_PASS}@${process.env.MONGO_HOST}:${process.env.MONGO_PORT}/${process.env.MONGO_DB}`;
MongoClient.connect(uri, { useNewUrlParser: true, useUnifiedTopology: true }, (err, client) => {
if (err) throw err;
console.log("Connected successfully to server");
db = client.db(process.env.MONGO_DB);
});
}
module.exports = {
getDb: () => {
if (!db) {
connectDb();
}
return db;
}
};
// post.js
const db = require('./db');
function Post(username, post, target_path, time) {
this.user = username;
this.post = post;
this.img = target_path;
if (time) {
this.time = time;
} else {
this.time = new Date().toISOString();
}
}
Post.prototype.save = async function() {
const collection = db.getDb().collection('posts');
await collection.insertOne(this);
};
Post.get = async function(username) {
const collection = db.getDb().collection('posts');
let query = {};
if (username) {
query.user = username;
}
return await collection.find(query).sort({ time: -1 }).limit(30).toArray();
};
module.exports = Post;
注意:
- 确保在BAE环境中设置了相应的环境变量,如
MONGO_USER
,MONGO_PASS
,MONGO_HOST
,MONGO_PORT
,MONGO_DB
。 - 使用
process.env
来读取这些环境变量,而不是硬编码。
这样可以确保你的应用在不同的环境中都能正确连接到MongoDB数据库。