我正在尝试创建一个基于Node(和Express)的应用程序,该应用程序在功能上类似于使用Mongo作为数据存储的WebAPI应用程序。我正在尝试使用TypeScript(以及VS 2013)。
我已经开始工作了,现在我正在努力清理它。
首先,Express 4.1.1可用,但没有任何打字。
第二,访问Mongo的正确方法是什么 - 进行连接和查询集合 - 这样就像Node希望的那样异步(所以我不会阻塞等)?我应该使用q / Promises吗?
第三,在另一个文件中访问方法的正确方法(在此设置中)是什么?我已经用import / export / require / module / class进行了一段时间的摔跤,以获得我认为似乎 ok 的内容,但到达那里真是太痛苦了。这就是我所拥有的:
带有一些导入等的app.ts和一个参考
/// <reference path='./scripts/typings/node/node.d.ts' />
import express = require('express');
import http = require('http');
import path = require('path');
import badgeApi = require('./routes/api/Badge');
var app = express();
...
new badgeApi.Badge();
app.get('/badge', badgeApi.Badge.ListAll);
...
然后,一些通用的DB代码:
/// <reference path='../../scripts/typings/mongodb/mongodb.d.ts' />
import util = require('util');
import mongodb = require('mongodb');
export var ConnectDataStore: (dbname: string, dbuser: string, dbpass: string) => mongodb.Db;
ConnectDataStore = (dbname: string, dbuser: string = 'xxxx', dbpass: string = 'xxxx') => {
var baseMongoConnect: string = 'xxxx';
var mongoConnect = util.format(baseMongoConnect, dbuser, dbpass, dbname);
var DB: mongodb.Db;
mongodb.MongoClient.connect(mongoConnect, (err, db) => {
if (!err) {
DB = db;
return DB;
}
else {
throw err;
}
});
}
然后是Badge.ts
import util = require('util');
import express = require('express');
import mongodb = require('mongodb');
import datastore = require('./DataStore');
export class Badge {
private static DB: mongodb.Db = null;
constructor() {
Badge.DB = datastore.ConnectDataStore('credential', 'xxxx', 'xxxx')
}
public static ListAll(req: express.Request, res: express.Response): void {
Badge.DB.collection('badge', (collErr, coll) => {
coll.find().toArray((arrayErr, badges) => {
if (badges.length > 0) {
res.jsonp(200, badges);
}
else {
res.send(200, 'No Badges');
}
});
});
}
}
现在我知道这不完全正常 - ConnectDataStore是错误的(它不会返回Db,因为它应该)。当我注意到我使用的是快递3.5.2,而不是4.1.1时,我开始解决这个问题,并且最终得到了我 - 这些东西不是很稳固。
当然,我可能会遗漏一些东西,但我不知道是什么!
这汤的任何方向都会受到赞赏!
答案 0 :(得分:1)
在Express 4+的定义文件之前,我建议你使用JavaScript作为应用程序的核心(因为它不需要改变很多)并使用TypeScript来处理应用程序逻辑(控制器等) 。在Node.JS中,混合和匹配很容易。
我会使用一个承诺来处理MongoDB连接或尽早建立连接,以至于应用程序实际上还没有开始提供网页,直到成功建立了MongoDB连接。
Express的3.0类型可能适用于许多地方的4+版本,因为签名通常是相同的。