如何将值从 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,
我正在创建一个小项目来大致熟悉 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,