将azure web app连接到azure cosmos db

时间:2018-04-14 14:52:45

标签: azure mongoose azure-cosmosdb

我正在尝试复制教程,使用mongoose Using Mongoose Framework with Azure Cosmos DB

将azure web app(基于express)连接到azure cosmos db

但是我无法连接到名为 testdb 的数据库。我有一个 server.js 文件,其中我为了简单而放置了所有代码,并且 .env 文件包含连接字符串和数据库的名称,如教程中所述

我已插入下面 server.js 所包含的代码。代码基于教程中的代码,只是我为应用程序添加了pug模板引擎,目的是一旦我创建了一个集合,我就可以从中获取信息并与pug模板集成。

应用程序显示的是pug文件,但数据库中没有创建任何集合,我不知道问题出在哪里。

本教程中似乎引人注目的一个问题是azure cosmos db的连接字符串已经包含" ?ssl = true& replicaSet = globaldb "我不明白为什么教程在连接数据库时会再次附加它。我已从.env文件中保存的连接字符串中删除了那部分但没有任何反应。我还在连接字符串中编码了特殊字符,如(==,@,?或/)。

对我来说,我无法正确形成连接字符串,但我不知道如何解决这个问题。尝试在空数据库中创建集合时,连接字符串的正确模式是什么?连接字符串和数据库名称之间以及数据库名称和查询之间应该有斜杠吗?

另一个问题与教程中的代码包含用于在控制台上显示消息的console.log函数调用这一事实有关。我的问题是,在浏览器控制台或节点控制台上应该在哪个控制台上显示消息?在浏览器中没有显示任何消息。

任何指导都将不胜感激。

非常感谢!

const express = require('express');
const http = require('http');

const mongoose= require('mongoose');
const env = require('dotenv').load();    //Use the .env file to load the variables

const app = express();
var port = process.env.PORT || 5050; //normalizePort(process.env.PORT || '5050');
app.set('port', port);
app.set('views', 'views');
app.set('view engine', 'pug');

mongoose.connect(process.env.COSMOSDB_CONNSTR+process.env.COSMOSDB_DBNAME+"?ssl=true&replicaSet=globaldb"); //Creates a new DB, if it doesn't already exist
//mongoose.connect(dbc);
let db = mongoose.connection;
db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', function() {
console.log("Connected to DB");
});

const cities = mongoose.model('cities', new mongoose.Schema({
    name: String,
    country: String
}));

const city = new cities({
 name: "Paris",
 country: "France"
});

city.save( function (err, savedCity) {
    console.log(JSON.stringify(savedCity));
});

app.get('/', function(req, res) {
    res.render('index', {
        panelTitle: "Azure CosmosDB Test",  
        panelBody:"Testing how to access Azure ComsosDB",
    });
});


app.use(express.static(__dirname + '/public'));

const server = http.createServer(app);
server.listen(port);

3 个答案:

答案 0 :(得分:2)

我最近完成了教程here,它引导您构建一个使用Mongoose连接到Cosmos DB的基于Express的服务器。您可以在此处查看最终结果: https://github.com/ydogandjiev/react-cosmosdb

我遇到的几个问题是:

  1. 我必须使用以下语法连接数据库(或转义密码字符串):

    mongoose.connect(`mongodb://${env.user}.documents.azure.com:${env.port}/?        ssl=true`, {
      auth: {
        user: env.user,
        password: env.password
      }
    });
    
  2. 使用最新版本的Mongo客户端需要您在CosmosDB实例上启用预览功能: CosmosDB Preview Features

答案 1 :(得分:1)

mongoose.connect希望字符串在conn str的网络部分和选项部分之间具有/DBNAME

mongoose.connect('mongodb://username:password@host:port/database?options...');

从CosmosDB门户获取连接字符串,并在/dbname

之前插入带有斜杠?ssl=true...的dbname

您可以将COSMOSDB_CONNSTR设置为连接字符串的一部分直到但不包括?,并确保以/

结尾。

请参阅http://mongoosejs.com/docs/connections.html

答案 2 :(得分:1)

正如我在对Yuri Doganjiev回答的评论中提到的,他的代码以及在azure cosmos db帐户的仪表板上启用预览功能的建议导致成功连接到azure cosmosdb并创建集合和查询数据库。我使用的 mongoose 的版本是 5.0.14

使用的实际连接代码如下所示 [host] [port] [username] [password ] 是azure仪表板上连接字符串选项卡中提到的值。 [dbname] 是希望连接的数据库的名称。我没有转义任何特殊字符,如(/,=,?)。实际上,当我试图逃避其中的一些时,我得到了错误消息。

mongoose.connect(`mongodb://[host]:[port]/[dbname]?ssl=true`, {
    auth: {
      user: `[username]`,
      password: `[password]`
    }
  })
  .then(() => console.log('connection successful'))
  .catch((err) => console.error(err));

对我来说,问题是我除了404之类的常见错误消息之外还没有收到任何错误消息 - 未找到或500 - 内部错误问题。

只有在我在应用程序的根目录下的kudu控制台中运行 npm start 之后,才开始收到有意义的错误消息,这有助于我确定问题是什么。此外,应用程序代码中使用的 console.log 函数在kudu控制台中打印其消息,显示连接是否成功或在集合中显示新插入的对象。

我遇到的另一个问题是你无法通过 Ctrl + C 结束kudu控制台中的节点进程。结束我发现的进程的唯一方法是kudu中的进程资源管理器,它显示正在运行的进程并让你杀死它们。因此,即使我对代码进行了更改,这些更改也不会立即反映在浏览器中,因为旧节点进程(使用旧代码)仍在运行。

我不知道哪种流程管理器使用Azure Web App,但并不总是代码中的更改反映在浏览器中。