急【新手求教】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);
			});
		});
	});	
});

}


12 回复

根据你提供的信息,你的应用在本地运行良好,但在部署到百度应用引擎(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服务。
  • 在代码中使用 Promiseasync/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连接字符串。以下是一些可能的原因和解决方案:

  1. 连接字符串格式:确保你在代码中使用的MongoDB连接字符串格式正确。在BAE环境中,你通常会从环境变量中获取这些信息。

  2. 环境变量:在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数据库。

回到顶部