我是一个长期的PHP(CodeIgniter和WordPress)开发人员,直到最近才想学习其他几种语言。我已经着手通过node.js学习Ruby(在Rails和Sinatra上),Python(在Flask框架下)和Javascript。
我决定使用每种语言创建一个我能想到的最基本的应用程序,即URL扩展器。除了node.js和Javascript,我已经设法用每种语言创建了一个工作版本。
我有点知道我的问题,我知道它与回调有关。我知道我做错了。我了解了回调的基本概念,但是我只是想不出如何解决我创建的这种混乱情况。
这是我的整个代码:
var http = require('http');
var url = require('url');
function expand() {
var short = url.parse('http://t.co/wbDrgquZ');
var options = {
host: short.hostname,
port: 80,
path: short.pathname
};
function longURL(response) {
console.log(response.headers.location);
}
http.get(options, longURL);
}
function start() {
function onRequest(request, response) {
console.log("Request received.");
response.writeHead(200, {
"Content-Type": "text/plain"
});
response.write("Hello World");
expand();
response.end();
}
http.createServer(onRequest).listen(8888);
console.log("Server has started.");
}
start();
服务器启动,并在发出请求时调用扩展函数,该函数在终端中返回扩展的URL。我正在尝试使其在浏览器中打印。
任何帮助表示赞赏。提前致谢。
您已经犯了一些缺陷。
您应该重写expand以传递URL并传递回调。任何执行异步操作的函数通常(data, callback)
在node
中都具有签名。这基本上可以让您说出我想让此功能执行某项操作,然后告诉我完成该操作的时间。
function expand(urlToParse, callback) {
// note we pass in the url this time
var short = url.parse(urlToParse);
var options = {
host: short.hostname,
port: 80,
path: short.pathname
};
// note we store the clientRequest object temporarily
var clientRequest = http.get(options, extractRealURL);
// Always attach the error handler and forward any errors
clientRequest.on("error", forwardError);
function extractRealURL(res) {
callback(null, res.headers.location);
}
function forwardError(error) {
callback(err);
}
}
在这里,回调应该具有(err, data)
节点中几乎所有回调都具有的签名。我们还添加了必须进行的错误处理。
现在,我们将onRequest更改为实际调用即可正确展开
function onRequest(request, response) {
// parse the incoming url. true flag unpacks the query string
var parsedUrl = url.parse(request.url, true),
// extract the querystring url.
// http://localhost:8888/?url=http://t.co/wbDrgquZ
urlToExpand = parsedUrl.query.url;
// call expand with the url and a callback
expand(urlToExpand, writeResponse);
function writeResponse(error, newUrl) {
// handle the error case properly
if (error) {
response.writeHead(500, { 'Content-Type': 'text/plain'});
// early return to avoid an else block
return response.end(error.message);
}
response.writeHead(200, { 'Content-Type': 'text/plain'});
// write the new url to the response
response.end(newUrl);
}
}
在这里,我们添加了错误处理逻辑,还解压缩了实际的URL,以从查询字符串进行扩展。
通常doSomething<data, callback<err, result>>
,node.js中的工作模式效果很好。
let result = doSomething<data> mayThrow err
除了它是异步的之外,它与您在普通阻塞语言中所期望的完全相同。
请注意ServerResponse
,通过这样做,您就无法通过将对象传递给函数的替代选项,从而在扩展函数和服务器响应之间创建了不必要的硬耦合。
扩展功能只应扩展一个URL并返回扩展的URL,它本身不做IO。
完整代码
问题内容: 据我了解,有三种调用异步代码的方法: 活动,例如 回调,例如 承诺 我找到了节点承诺库,但是我不明白。 有人可以解释什么是诺言,为什么我要使用它? 另外,为什么将它从Node.js中删除? 问题答案: node.js中的承诺承诺会做一些工作,然后有单独的回调,将为成功和失败以及处理超时而执行。在node.js中考虑promise的另一种方式是,它们是可能仅发射两个事件的发射器:成功和错
问题内容: 我只是从node.js开始。我做了一些ajax的工作,但是没有什么太复杂的,所以回调仍然有点麻烦。我看了看异步,但我所需要的只是顺序运行一些功能。 我基本上有一些东西可以从API中提取一些JSON,然后创建一个新的JSON,然后对此进行处理。显然,我不能只运行它,因为它可以一次运行所有内容并且具有空的JSON。通常,流程必须按顺序运行,但是如果在从API中提取JSON时可以在等待时提取
问题内容: 我了解将一个函数作为回调传递给另一个函数并让其执行,但是我不了解执行此操作的最佳实现。我正在寻找一个非常基本的示例,例如: 在myFirstFunction中,如果我确实返回了新的callback(),则它可以工作并执行匿名函数,但这对我来说似乎不是正确的方法。 问题答案: 你可以说 或者,如果要在回调中调整的值,则可以使用该方法。 函数内部将是任何东西。
本文向大家介绍了解node.js中的npm脚本,包括了了解node.js中的npm脚本的使用技巧和注意事项,需要的朋友参考一下 到目前为止,我们正在使用以下命令运行App.js- 节点App.js 我们可以使用npm脚本来运行或调试我们的应用程序。 如何启动节点项目 命令是-npm init 上面的命令将启动一个项目,它将询问有关项目名称和启动文件名等的几个问题。 由于我们拥有App.js文件,因
问题内容: 我需要从两个Web服务器请求数据。任务是独立的;因此,我正在使用aync.parallel。现在,我只在网页正文中写入“ abc”,“ xyz”和“完成”。 由于任务是同时执行的,我能否遇到奇怪的输出?例如, 代码。 问题答案: 如果要绝对确定结果的打印顺序,则应通过回调(第一个参数是错误)传递数据(和),并在最终的回调参数中处理/写入它们。
有人能使用下面的示例数据解释JavaScript Truthy和Falsy吗?我读过其他线程,但仍然感到困惑。 根据我的理解,我认为var a=1 是唯一的真理,其余的都是虚假的-这是正确的吗?