3

我在使用 Adob​​e Brackets 运行 Node.js 服务器时遇到问题。进入实时预览后(URL 为http://localhost:SOMERANDOMPORT/path/to/file.html),我启动服务器。如果我http://localhost:3000/test直接在另一个选项卡中输入,它会显示正确的 JSON。

然后,我向一个元素添加了一个事件函数file.html,在单击它时,它会向我的服务器发出 AJAX 请求,并使用响应来更改它的一些内部 HTML。但是,在实时预览中单击元素会失败,而是调用错误回调。

我怎样才能解决这个问题?我怀疑这与 AJAX 请求发送到http://localhost:SOMERANDOMPORT/test而不是的事实有关http://localhost:3000/test,但我似乎找不到解决方案。

一切都在本地运行。下面是我的服务器:

var express = require('express');
var mysql = require('mysql');

var app = express();

app.get('/test', function(req, res){
    var connection = mysql.createConnection(...);

    connection.query("SELECT author FROM posts", function(err, results) {
        if (err) {
            console.log(err);
            console.log('Error on retrieving data.');
            res.send(err);
            return;
        }
        console.log(results[results.length - 1]);
        res.send(results[results.length - 1]); // return last row
    });

    connection.end();
});

app.listen(3000);
console.log('Listening on port ' + port);

和事件功能:

function getAuthor() {
    $.ajax({
        type: 'GET',
        url: '/test',,
        success: function(data, status) {
            $('.author').text('Authored by ' + data.author);
        },
        error: function(jqXHR, status, error) { // this always get called
            $('.author').text('Something went wrong.');
        }
    });
}

我很感激任何帮助。

4

1 回答 1

3

最简单的解决方法是将 Live Preview 直接指向您自己的 Node 服务器,让它从正确的端口号自己提供页面(而不是从位于不同端口的 Brackets 内置服务器提供页面)。请参阅Brackets wiki 上“使用您自己的后端”下的说明。

缺点是禁用了 HTML 实时更新 - 但您仍然可以获得 CSS 实时更新,并且 Brackets 在保存 HTML 内容时依靠更简单的“实时重新加载” 。

要保持启用实时 HTML 更新,您需要以某种方式解决端口号差异。您可以硬编码一个localhost:3000基本 URL 进行测试,但由于端口号不匹配,您会遇到同源问题。解决这个问题将非常复杂(在您的节点服务器上设置CORS等)。

保持完整实时预览体验的另一种选择是填充所有$.ajax()调用,以便它们返回硬编码的虚拟数据而不会访问服务器。如果您已经对单元测试进行了一些模拟,那么您也许可以为此重用现有的基础设施。

于 2014-01-27T22:55:41.597 回答