TypeScript,NodeJs / Express和Mongo(使用VS 2013)

时间:2014-05-01 22:00:22

标签: node.js express typescript

我正在尝试创建一个基于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时,我开始解决这个问题,并且最终得到了我 - 这些东西不是很稳固。

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

这汤的任何方向都会受到赞赏!

1 个答案:

答案 0 :(得分:1)

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

我会使用一个承诺来处理MongoDB连接或尽早建立连接,以至于应用程序实际上还没有开始提供网页,直到成功建立了MongoDB连接。

Express的3.0类型可能适用于许多地方的4+版本,因为签名通常是相同的。