$ .ajax在被调用时不是函数

时间:2016-03-26 17:03:17

标签: javascript jquery ajax node.js

由于某种原因,当我运行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"});
});

2 个答案:

答案 0 :(得分:5)

请参阅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

答案 1 :(得分:0)

如果您使用jquery来发出http请求,您可以使用http或请求节点模块来代替。

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"});
    });
});