TypeScript, NodeJs/Express and Mongo (with VS 2013)



我试图创建一个基于Node(和Express)的应用程序,其功能类似于使用Mongo作为数据存储的WebAPI应用程序。我正在尝试使用TypeScript(以及VS 2013)。

我已经让它工作了,现在我正在努力清理它。

首先,Express 4.1.1是可用的,但是没有它的类型。

第二,访问Mongo的正确方式是什么——既建立连接,又查询集合——这样它就像Node希望的那样异步(这样我就不会阻塞,等等)?我应该用q/Promises吗?

第三,在这个设置中,访问另一个文件中的方法的正确方法是什么?我已经与import/export/require/module/class进行了一段时间的搏斗,以获得我认为似乎ok的,但是到达那里是多么痛苦。我有:

应用程序。t带有一些导入,等等和一个引用

/// <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,因为它应该)。我开始通过让它返回一个承诺来解决这个问题,当我注意到我使用的是express 3.5.2,而不是4.1.1,这一切终于得到了我-这个东西不是很可靠。

当然,我可能遗漏了一些东西,但我不知道是什么!

这汤周围的任何方向将是感激!

在有Express 4+的定义文件之前,我建议你使用JavaScript作为应用程序的核心(因为它不需要做太多改变),而使用TypeScript来做应用程序逻辑(控制器等)之类的事情。在Node.JS中,很容易混合和匹配。

我会使用一个承诺来处理MongoDB连接或使连接足够早,应用程序还没有真正开始服务网页,直到 MongoDB连接已经成功建立。

Express的3.0类型在许多地方可以与4+版本一起工作,因为签名通常是相同的。