如何将值从 Web 服务传递到路由,然后传递到 Express 和 NodeJS 中的数据库调用

How to pass value from web service to route and then to database call in Express and NodeJS

我正在创建一个小项目来大致熟悉 NodeJS、Express 和 MEAN 堆栈。我对网络开发也很陌生。

我想为我的小网站添加搜索功能。我有一个控制器、Web 服务和一个 javascript 文件,其中包含我所有的数据库调用 (MongoDB)。

我的问题是:如何将用户输入的搜索值从web服务传递到路由再传递到db?我到处都看过,但一直找不到具体的例子。这就是我的目的。

我的控制器调用我的网络服务。

this.search = function(searchValue,callback) {
    console.log(searchValue);
    $http({
        method: 'GET',
        url: '/contacts/search/:searchValue',
        params: {searchValue: searchValue},
        headers: {'Content-type': 'application/json'}
    }).success(function(resp){
        console.log("here");
        callback(resp);
    }).error(function(){
        callback(undefined);
    });
};

接下来,我的网络服务调用我的路由...

router.get('/search/:searchValue', function(req, res) {
    db.search(req.params.searchValue, function(err,data){
        if(!err) {
            res.json(data);
        }else{
            res.json({code:-1,err:err});
        }
    });
});

然后数据库调用...

database.prototype.search = function(id,callback){
    mongo.connect(dbUrl, function(err, db) {
        if(!err) {
            db.collection('friends',function(err,coll){
                coll.find({friend:"Jimmy"}).toArray(function(err, items) {
                    db.close();
                    callback(null,items);
                });
            });
        }else{
            db.close();
            console.log("hi");
            callback(err,null);
        }
    });
};

当我将搜索值硬编码到我的数据库调用中时,一切正常(即上面​​的 "Jimmy")。但是,我不知道如何将搜索值从我的 Web 服务传递到我的路由,然后再传递到数据库。我收到诸如无法找到路由或无法连接到数据库之类的错误。当我对值进行硬编码时,愚蠢的事情就会消失。

无论如何,感谢您的时间和耐心。

在您的路由器(您称之为网络服务)中,您将这样调用数据库搜索功能:

router.get('/search/:searchValue', function(req, res) {
    db.search(req.params.searchValue, function(err,data){
        ...

请注意,您正在传递给 db.search req.params.searchValue

但是在你的数据库中你有相同的搜索函数定义为:

database.prototype.search = function(id, callback){...

如您所见,它以 id 作为参数。 这里显然存在脱节。您正在从路由器将 searchValue 传递给它,但您已将其定义为采用 id.

然后在数据库搜索功能中进一步向下执行此操作:

database.prototype.search = function(id,callback){
    mongo.connect(dbUrl, function(err, db) {
        if(!err) {
            db.collection('friends',function(err,coll){
                coll.find({friend:"Jimmy"}).toArray(function(err, items) {
                    ...

您正在调用 coll.find,您可能希望将 searchValue 传递给它。这里还有另一个断开连接,您永远不会使用作​​为参数的 id

如果你说要让事情正常运行,你所要做的就是把 "Jimmy",我猜是 searchValue,那么你应该试试这个:

database.prototype.search = function(searchValue,callback){ // replace id with searchValue
    mongo.connect(dbUrl, function(err, db) {
        if(!err) {
            db.collection('friends',function(err,coll){
                           // use searchValue here
                coll.find({friend:searchValue}).toArray(function(err, items) {
                    ...

编辑

你的客户端代码也有问题

$http({
    method: 'GET',
    url: '/contacts/search/:searchValue',
    params: {searchValue: searchValue},
    headers: {'Content-type': 'application/json'}

在这里,您正在使用 Angular 的 $http 模块进行 AJAX 调用。您正在发出 GET 请求,但同时传递 params,这通常仅在您发出 POST 请求时传递。此外,您定义路线的方式只是从 URL 本身读取 searchValue 。所以这里的URL应该是这样的:

$http({
    method: 'GET',
    url: '/contacts/search/' + searchValue,
    // params: { no need for params }
    ...

进一步解释 URL 参数的工作原理:

如果您要求 URL 像这样

GET /contacts/search/abcd

然后您将像这样定义您的 Express 路由处理程序

app.get('/contacts/search/:name', function(req, res, next){
    req.params.name //=> "abcd"
});

注意路由定义的语法 /contacts/search/:name 仅用于在 Express 中定义路由。

/:name 部分只是将变量名 - name 分配给值 - "abcd" 所以它可以作为 req.params.name

访问

这就是为什么这是错误的

$http({
    method: 'GET',
    url: '/contacts/search/:searchValue',

应该是这个

$http({
    method: 'GET',
    url: '/contacts/search/' + yourActualSearchValue,