我正在尝试让node.js在调用时从mongoDB数据库返回信息。在我的数据库中,我有
_id: ObjectID("5cc0fe18f7875c00bc88de4c")
url:"google.com?ref_source=test"
count:0
基本上,当我做http://localhost:8080/count/google.com+test
时,我希望我的代码进入MongoDB并检索count
前面的值。当我运行此代码时,结果,1
正在记录但未返回。相反,{}
正在返回。
const express = require('express')
const bodyParser = require('body-parser')
const app = express()
app.use(bodyParser.text())
var MongoClient = require('mongodb').MongoClient;
var mongourl = "mongodb://localhost:27017/";
async function getcount(fullurl) {
try{
var db = await MongoClient.connect(mongourl) //Connect to mongoDB
var dbo = db.db("analytics") //Connect to analytics DB
var query = {url: fullurl} //Find results with the input under URL
var result = await dbo.collection("main").find(query).toArray() //Connect to main collection
let res = JSON.stringify(result)
res = res.substring(res.indexOf(":") + 1)
res = res.substring(res.indexOf(":") + 1)
res = res.substring(res.indexOf(",") + 1)
res = res.substring(res.indexOf('":') + 2)
res = res.substring(0, res.indexOf('}]'))
// Get result
db.close()
return await res //Return it
}
catch(error)
{
return error
}
}
function isURL(str){
var pattern = new RegExp('^((ft|htt)ps?:\\/\\/)?'+ // protocol
'((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|'+ // domain name and extension
'((\\d{1,3}\\.){3}\\d{1,3}))'+ // OR ip (v4) address
'(\\:\\d+)?'+ // port
'(\\/[-a-z\\d%@_.~+&:]*)*'+ // path
'(\\?[;&a-z\\d%@_.,~+&:=-]*)?'+ // query string
'(\\#[-a-z\\d_]*)?$','i'); // fragment locator
return pattern.test(str);
}
async function count(string){
try {
//console.log(string)
string = string.split("(!").join("/");
//console.log(string)
string = string.split("/?ref_source=").join("+");
//console.log(string)
string = string.split("https://").join("");
//console.log(string)
lengths = string.split("+")
toReturn = ("Not a Valid Url Input: " + lengths[0])
if (isURL(lengths[0])) {
if ((lengths[1] == "") || (lengths[1] == "undefined")) {
return "Not A Valid Identifier Input"
}
fullurl = (lengths[0] + "?ref_source=" + lengths[1])
console.log(fullurl)
let response = await(getcount(fullurl))
console.log(response) //Log the info
return await (response) //Return it. THIS is THE PART THAT FAILS
}
}
catch(error)
{
return error
}
}
app.get('/count/:string', (req, res) => {
res.send((count(req.params.string)))
})
app.listen(8080, () => console.log('> Listening!'))
由于count是异步函数,你必须在使用res.send()发送它们之前等待结果,这样的事情(注意我在函数之前添加了异步)。
app.get('/count/:string', async (req, res) => {
let result = await count(req.params.string)
res.send(result)
})
或者你必须使用诺言
app.get('/count/:string', (req, res) => {
count(req.params.string).then(result =>{
res.send(result)
})
})
当你“返回await res”时,你告诉Node你正在返回一个Promise。你应该只使用“return res”(在getcount中)和“return response”(在你的count函数中),因为这些都是已定义的变量,而不是实际的异步函数。