【问题标题】:$.ajax is not a function when being called$.ajax 在被调用时不是函数
【发布时间】:2016-03-26 17:03:17
【问题描述】:

由于某种原因,当我运行 npm start 并点击浏览器时,我得到了带有此错误的堆栈跟踪。

TypeError: $.ajax 不是函数

at getLocationFromIp (G:\Github\Expressjs\nodetest1\routes\index.js:13:7)
at G:\Github\Expressjs\nodetest1\routes\index.js:24:14

谁能告诉我为什么?这是我的代码。谢谢!

var express = require('express');
var router = express.Router();
var externalip = require('external-ip');
var $ = require('jquery');

getLocationFromIp = function() {
    $.ajax({
       url:"freegeoip.net/json/",
       type: "GET",
       data: null,
       dataType: "json",
       success: function(){console.log("success!")}
     });
 }

router.get('/', function(req, res) {
    var ip = getLocationFromIp();
    res.render('index', { 'ip' : "hi"});
});

【问题讨论】:

  • 尝试在 $(document).ready(function(){}) 函数中添加代码
  • @Dale — 什么document?
  • 问题可能在于通过 require 函数异步加载 Jquery。有没有办法在 Jquery 脚本加载后触发 getLocationFromIp 函数?它可能会解决您的问题。
  • @Elvanos — require async 是从什么时候开始的?
  • 嗯...有没有办法让 jquery 在需要加载后触发?如果这是问题

标签: javascript jquery ajax node.js


【解决方案1】:

the documentation:

要让 jQuery 在 Node 中工作,需要一个带有文档的窗口。由于 Node 中不存在这样的窗口,因此可以通过 jsdom 等工具来模拟。这对于测试目的很有用。

var externalip = require('external-ip');

require("jsdom").env("", function(err, window) {
    if (err) {
        console.error(err);
        return;
    }
    var $ = require("jquery")(window);

     function getLocationFromIp() {
        $.ajax({
            url: "freegeoip.net/json/",
            type: "GET",
            data: null,
            dataType: "json",
            success: function() {
                console.log("success!")
            },
            error: function() {
                console.log("error", arguments[2])
            }
        });
    }
    var ip = getLocationFromIp();
    console.log(ip);
});

您最好使用从一开始就设计用于与 Node 一起使用的 HTTP 库,例如 request

【讨论】:

  • 这意味着我也必须运行 npm install jsdom 吗?这会怎么火?加载?
  • 是的,您需要安装 jsdom 才能使用它。 onload 在这种情况下毫无意义,没有加载任何内容。您只需在启动服务器之前设置 jQuery。正如我所说,您最好使用不同的库来发出 HTTP 请求,这样会简单得多。
  • 如果它丢失了一个文档,那么一个解决方案是简单地将这个ajax调用移动到客户端吗?
  • 你可能会直接遇到同源策略。
  • 我也得到了这个在 TypeScript 中的工作。我在这里发布了要点:gist.github.com/ctaggart/87fea160bea50c11a36954bd4dc865c5
【解决方案2】:

如果您使用 jquery 只是发出一个 http 请求,您可能可以使用 http 或 request 节点模块来代替。

var express = require('express');
var router = express.Router();
var externalip = require('external-ip');
var http    = require('http');

getLocationFromIp = function(done) {
  var options = {
    host: "freegeoip.net",
    port: 80,
    path: "/json"
  };

  var request = http.get(options, function(response) {
    var result = "";
    var responseCode = response.statusCode;

    response.on('data', function(data) {
      result += data;
    });

    response.on('end', function() {
      if(responseCode >= 400)
        return done(result, null);
      else
        return done(false, JSON.parse(result));
    });
  });

  request.on("error", function(error){
    return done("Error handling error", null);
  });

  request.end();
}

router.get('/', function(req, res) {
    var ip = getLocationFromIp(function(error, ip){
      res.render('index', { 'ip' : "hi"});
    });
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-25
    • 1970-01-01
    • 2011-11-15
    • 1970-01-01
    • 2019-11-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多