0

经过几周尝试在 Internet 上探索 Nodejs 及其基本教程后,我只是一个 Nodejs 用户。当我开始进入真正的自编程服务器时,我遇到了几个我试图谷歌但没有资源似乎有帮助的问题,所以,是的,我在这里问。请帮助我理解这些并成为节点开发人员:

1)正如我所经历的,只有1个服务器文件 server.js通过nodejs作为服务器运行。作为一名 PHP 开发人员开始,我不熟悉它是如何工作的,例如,如果你有,就 PHP 而言,process.php、rank.php、whatever.php 处理不同的任务,我只需要将这些数据发送到根据服务器文件,但在 nodejs 的情况下,我只能有 1 个 server.js 文件,那么我怎么能从一个服务器文件处理不同的任务呢?无论如何要创建超过 1 个服务器文件?(我真的不想弄乱一个包含许多参数的文件来执行不同的任务并使文件大小显着变大!)

2)假设第一个问题解决了,现在它导致了另一个问题。我一直在尝试一些关于数据库管理的教程,比如 mysql 或邮件(这需要我输入我的电子邮件密码),...但是我注意到,我在 javascript 文件中输入了所需的密码?!?!?我试过localhost/server.js了,文件是公开的……我真的需要担心吗?

3)现在随着我进一步熟悉nodejs和php功能,例如邮件,加密......我需要为不同的任务安装不同的模块,我想有一天如果我在线托管它,我必须重新 -重新开始安装?我只是想知道为什么没有像 PHP 这样的标准函数。当然,这是个人问题。

4)我想请你帮我扔几行代码(我只需要它非常基本的)如何发送请求,接收数据就像下面的代码一样,但是在nodejs中。这将有助于我抽象地理解 nodejs 是如何工作的。

[索引.html]

$.ajax({
    url: "process.php", //Which address should I send to if I use nodejs
    type: "POST",
    data: "p=test"
}).done(function(data) {
    console.log(data);
});

[进程.php]

die($_POST["p"]);

——致以最诚挚的问候和赞赏。蒂姆

4

3 回答 3

2
  1. 我认为这里对 Web 服务器的工作方式存在一些严重的误解。传统上,在 Apache 上运行 php 会将所有 URL 映射到服务器文件系统上的相应脚本。然而,大多数结合mod_rewrite()规则的 php web 框架(Zend、Symfony、CakePHP 等)会将所有请求发送到单个控制器,然后该控制器根据请求 URL 将这些请求路由到适当的脚本。这是对它如何与 php 一起使用的一个很好的简要说明。当您使用 node.js 和默认的 server/hello world 示例时,不提供此路由,这意味着您需要自己构建它或使用框架(如 express)为您处理它。这与使用上述框架之一在 php 中构建 Web 应用程序没有太大区别。

  2. 无论编程语言如何,用户名和密码之类的东西都不应该以纯文本形式存储。(理想情况下,您应该拥有 API 密钥,而不是用户名和密码。)有几种方法可以处理这个问题,但最简单的方法是在每个环境(开发、QA、生产)中设置一个环境变量) 用于 API 密钥、用户名等。

  3. 使用npm。创建一个package.json文件来管理所有依赖项。那么部署应该像npm install在每个环境中运行一样简单。

  4. 这将取决于您决定使用哪个框架(如果有),我建议查看相应的文档以获取有关如何处理 POST 请求的示例。

于 2013-08-31T06:57:55.347 回答
2

1) Nodejs 与 PHP 有点不同。你要做的是运行一个接受 http 请求并处理它的 web 服务器。在 PHP 世界中,这是由另一台服务器完成的。通常这是 Apache 或 nginx,但那不是 PHP。所以,你应该做的是使用像 Express 这样的框架或编写自己的路由逻辑。例如:

var sendResponse = function(str, res) {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end(str + '\n');
}
var http = require('http');
http.createServer(function (req, res) {
    var url = req.url;
    switch(url) {
        case "/test": sendResponse("test url", res); break;
        case "/about": sendResponse("about url", res); break;
        default: sendResponse("default url", res);
    }
    sendResponse("test", res);  
}).listen(1337, '127.0.0.1');
console.log('Server running at 127.0.0.1:1337');

在该示例中,您解析给定的 url 并执行一个 javascript 函数。您应该将页面组织成模块并相应地要求它们。所以,如果你运行上面的代码,你可以输入一个 url,比如 127.0.0.1:1337/about

2)不,文件将不可见。在您的机器上发生的事情是您正在运行另一台服务器。因此,您实际上将 javascript 文件作为静态文件打开。停止您的 Apache,您将看到该文件不可访问。

3) 这就是 Nodejs 的美妙之处。包管理系统使安装变得简单且极其灵活。您可以使用大量模块并安装您想要的任何东西。这也使您能够构建自己的模块。在 PHP 中,没有像 Nodejs 那样好的中央分布式系统,这使得将模块从一个项目转移到另一个项目变得困难。

4)这是一个简单的nodejs服务器:

var serverHTML = function(res) {
    res.writeHead(200, {'Content-Type': 'text/html'});
    var str = '\
        <html>\
            <head>\
                <title>Page</title>\
            </head>\
            <body>\
                <h1>Page</h1>\
            </body>\
        </html>\
    ';
    res.end(str + '\n');
}
var serveAjaxData = function(res) {
    res.writeHead(200, {'Content-Type': 'application/json'});
    res.end('{"data":"..."}\n');
}
var http = require('http');
http.createServer(function (req, res) {
    switch(req.url) {
        case "/process": serveAjaxData(res); break;
        default: serverHTML(res);
    }   
}).listen(1337, '127.0.0.1');
console.log('Server running at http://127.0.0.1:1337/');

只需使用与第 1 点相同的方法。并映射一个特定的 url,它将数据返回到 ajax 请求。这只是一个路由问题。

一般来说,有很多模块,可以让你的生活更轻松。有框架,封装了纯 nodejs 服务器、模板语言、数据库适配器等。

于 2013-08-31T07:25:28.410 回答
0

我想你应该先明白一件事..

Node.js 和 PHP 是编写 Web 应用程序的两种截然不同的方式。
PHP 是一种脚本语言。在服务器接收到一个看起来像 PHP 脚本的请求后,相关的 PHP 脚本将由 Apache(或任何其他服务器)执行。如果它收到对其他静态文件的请求,它会再次尝试从文档根目录获取它们并提供它们。PHP与此无关。

另一方面,Node.js是服务器。了解这一点非常重要。运行node app.js只是开始执行文件。这就对了。除非您愿意,否则它甚至不会启动 Web 服务器。该文件现在是您的服务器脚本。除非您以这种方式编写,否则它不会执行或获取其他文件。将文件存储在 node.js 应用程序文件夹中并不意味着现在可以从 Web 访问这些文件,因为默认情况下 Web 服务器(如果您已初始化)并未配置为仅从该目录获取内容。(顺便说一句,有一种方法可以让公共 Web 可访问目录轻松快捷)。

这应该回答你的前两个问题。关于您的第三个问题:您现在可能已经知道了,但是 Node.js 本质上是非常低级的。它做了一些事情,但非常有效且非常好。它不是像 PHP 那样带有多个库的“一刀切”工具。

我认为其他答案可以帮助您解决第四个问题。我只是想把这个告诉你。

于 2013-08-31T11:39:17.237 回答