使用MongoDB对Windows Azure上的node.js应用程序的第一次请求产生400 Bad Request

时间:2013-03-19 22:48:33

标签: node.js mongodb azure mongoose

我正在使用Windows Azure来部署我编写的node.js应用程序,该应用程序向客户端公开了一个相当简单的REST CRUD API。它托管在Windows Azure网站中,并通过带有mongoose的Windows Azure商店使用MongoDB。我对服务的请求是JSON,响应是JSON(不确定是否重要,但其他人已经讨论了400个对Content-Type of application / json请求的响应)

在很长一段时间的第一次访问中,应用程序返回400 Bad Request。只要我经常点击它(至少每分钟一次)保持应用程序“温暖” - 我似乎再也不会这样了。

主机扩展设置无关紧要 - 我在免费套餐上获得与保留模式相同的功能。

其他人见过这个吗?

2 个答案:

答案 0 :(得分:1)

为了保证对node.js中任何连接的访问​​,您必须将所有需要连接的代码放在回调中。 mongoose暴露这种联系的方式是通过一个事件。当mongoose连接调用事件'open'时,您就可以访问数据库连接。

mongoose.connect('details');

mongoose.on('open', function () {
  var connection = mongoose.connection;

  // Do things with your connection here
  doThings(connection);
});

function doThings(connection) {
  app.get(...);
}

答案 1 :(得分:0)

如果你有一个代码片段会有所帮助,但我的猜测是你的mongo连接是异步发生的,你的网站在连接实际打开之前就是在提供请求。

我测试了这种情况,无法重现该问题。您可以在此处查看我的代码:https://github.com/ntotten/azure-mongo-sample

基本上,我正在使用mongoose进行连接,并且在加载应用程序时会立即发生连接。你可以看到下面的代码。

app.js:

/**
 * Module dependencies.
 */

var express = require('express')
  , routes = require('./routes')
  , user = require('./routes/user')
  , http = require('http')
  , path = require('path');

var TaskList = require('./routes/tasklist');
var taskList = new TaskList(process.env.CUSTOMCONNSTR_MONGOLAB_URI);

...

tasklist.js:

var mongoose = require('mongoose')
  , task = require('../models/task.js');


module.exports = TaskList;


function TaskList(connection) {
  mongoose.connect(connection);
}

...