Home php c# sql c c++ javascript python java go android git linux asp.net django .net node.js ios xcode cocoa iphone mysql tomcat mongodb bash objective-c scala visual-studio apache elasticsearch jar eclipse jquery ruby-on-rails ruby rubygems android-studio spring lua sqlite emacs ubuntu perl docker swift amazon-web-services svn html ajax xml java-ee maven intellij-idea rvm macos unix css ipad postgresql css3 json windows-server vue.js typescript oracle hibernate internet-explorer github tensorflow laravel symfony redis html5 google-app-engine nginx firefox sqlalchemy lucene erlang flask vim solr webview facebook zend-framework virtualenv nosql ide twitter safari flutter bundle phonegap centos Register | Login | Edit Tags | New Questions | 繁体 | 简体


10 questions online user: 23

0
votes
answers
7 views
+10

錯誤:發送後無法設置標題。

-2

錯誤:發送後無法設置標題。我討厭這個問題,因爲得到它很多次,儘管我發現我的錯誤,但我錯了。 好的,這是我的代碼。錯誤:發送後無法設置標題。

const mongoose = require ("mongoose"); 
const Spec = require("./specialist"); 
const Person = require("./person"); 
const Company = require("./company"); 
const bcrypt = require("bcryptjs"); 

module.exports.findUser=function(username,callback){ 
    let query = {email_num:username}; 
    Spec.findOne(query,(err_spec,spec_user)=>{ 
     if(err_spec) throw err_spec; 
     if(!spec_user){ 
      Person.findOne(query,(err_person,person_user)=>{ 
       if(err_person) throw err_person; 
       if(!person_user){ 
        Company.findOne(query,(err_company,company_user)=>{ 
         if(err_company) throw err_company; 
         if(!company_user){ 
          return console.log("Error User Not Found"); 
         } 
         return callback(null,company_user); 
        }); 
       } 
       return callback(null,person_user); 
      }); 
     } 
     return callback(null,spec_user); 
    }); 
}; 
module.exports.comparePassword = function(candidatePassword, hash, callback){ 
    bcrypt.compare(candidatePassword, hash, (err, isMatch) => { 
    if(err) throw err; 
    callback(null, isMatch); 
    }); 
}; 
module.exports.saveToken = function(username,role,token,callback){ 
    let query = {email_num:username}; 
    let updateToken={updatedToken:token}; 
    if(role==="Person-User"){ 
     Person.findOneAndUpdate(query,updateToken,callback); 
    }else if(role==="Specialist-User"){ 
     Spec.findOneAndUpdate(query,updateToken,callback); 
    }else if(role==="Company-User"){ 
     Company.findOneAndUpdate(query,updateToken,callback); 
    }else{ 
     console.log("Something went goes wrong"); 
    } 

} 

我已創建3個集合,並且此文件用於處理它們全部。 這是我的主要服務器代碼。

const express = require("express"); 
const mongoose = require("mongoose"); 
const bodyParser = require("body-parser"); 
const cors = require("cors"); 
const handlebars = require("express-handlebars"); 
const app = express(); 
const passport = require('passport'); 
const cookieParser = require("cookie-parser"); 

const config = require("./config/data"); 
const routes = require("./routes/users"); 
const company = require("./routes/company"); 
const person = require("./routes/person"); 
mongoose.Promise = global.Promise; 

let options = { 
    useMongoClient: true, 
    reconnectTries: Number.MAX_VALUE, 
    reconnectInterval: 500, 
    poolSize: 10, 
    bufferMaxEntries: 0 
    }; 

mongoose.connect(config.database,options); 

let db = mongoose.connection; 
db.on('error', console.error.bind(console, 'connection error:')); 
db.once('open', function() { 
console.log(`DB connected ${new Date()}...`); 
}); 


//app.set('views',__dirname+'views'); 
app.engine('handlebars', handlebars({defaultLayout:false})); 
app.set('view engine', 'handlebars'); 
app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded({ extended: false })); 

app.use(express.static(__dirname + '/public')); 

// app.use(cors()); 
app.use(cookieParser()); 

// Passport Middleware 
// require('./config/passport')(passport); 
app.use(passport.initialize()); 

app.use(passport.session()); 


app.get("/",(req,res)=>{ 
    res.render("index"); 
}); 

// app.get("/forgotPass",(req,res)=>{ 
//  res.render("forgotPass"); 
// }); 
app.get("/user", (req,res)=>{ 
    res.render("user"); 
}); 

app.get("/login",(req,res)=>{ 
    res.render("login"); 
}); 
app.get("/signup",(req,res)=>{ 
    res.render("signup"); 
}); 
app.get("/we",(req,res)=>{ 
    res.render("we"); 
}); 
app.get("/blog",(req,res)=>{ 
    res.render("blog"); 
}); 
app.get("/contactUs",(req,res)=>{ 
    res.render("contactUs"); 
}); 
app.get("/userAsApplicant",(req,res)=>{ 
    res.render("userAsApplicant"); 
}); 
app.use("/users",routes); 
app.use("/company",company); 
app.use("/person",person); 
app.get("/faq",(req,res)=>{ 
    res.render("faq"); 
}); 
app.listen(config.port,()=>{ 
    console.log(`Server running on port ${config.port}....`); 
}); 

對於很多表單處理程序,我對所有請求都使用Ajax。

$(function() { 
    $('.subForm').on('submit', function (e) { 
     $.ajax({ 
      type: 'post', 
      url: 'http://localhost:3000/users/spec/register', 
      data: $(this).serialize(), 
      success:function(data){ 
       if(data.success){ 
        location.href="http://localhost:3000/login" 
       }else{ 
        location.href="http://localhost:3000/signup" 
       } 
      } 
     }); 
     e.preventDefault(); 
    }); 

     $('.personAuth').on('submit', function (e) { 
      $.ajax({ 
       type: 'post', 
       url: 'http://localhost:3000/person/register', 
       data: $(this).serialize(), 
       success:function(data){ 
        if(data.success){ 
         location.href="http://localhost:3000/login" 
        }else{ 
         console.log("Chexav"); 
         location.href="http://localhost:3000/signup"; 

        } 
       } 
      }); 
      e.preventDefault(); 
     }); 
     $('.companyAuth').on('submit', function (e) { 
      $.ajax({ 
       type: 'post', 
       url: 'http://localhost:3000/company/register', 
       data: $(this).serialize(), 
       success:function(data){ 
        if(data.success){ 
         location.href="http://localhost:3000/login" 
        }else{ 
         location.href="http://localhost:3000/signup" 
        } 
       } 
      }); 
      e.preventDefault(); 
     }); 
     $('.logInForm').on('submit', function (e) { 
      $.ajax({ 
       type: 'post', 
       url: 'http://localhost:3000/users/authenticate', 
       data: $(this).serialize(), 
       success:function(data){ 
        console.log(data); 
        if(data.token){ 
         localStorage.setItem("Authorization",data.token); 
         $.ajax({ 
          type:'get', 
          url:'http://localhost:3000/users/user', 
          beforeSend: function(xhr){xhr.setRequestHeader('auth', localStorage.getItem("Authorization"));}, 
          success:location.href="http://localhost:3000/users/user" 
         }) 
        } 
       }  
      }); 
      e.preventDefault(); 
     }); 

    }); 

而這條路由用於驗證。

const express = require("express"); 
const router = express.Router(); 
const Spec = require("../models/specialist"); 
const jwt = require("jsonwebtoken"); 
const config = require("../config/data"); 
const Model = require("../models/model"); 

    //Registration route 
    router.post("/spec/register",(req,res)=>{ 
     let date=new Date(); 
     let newUser = new Spec({ 
      name:req.body.spec_name, 
      email_num:req.body.spec_email, 
      password:req.body.spec_password, 
      role:"Specialist-User", 
      isActive:true, 
      created:date, 
      updatedToken:"JWT" 

     }); 
     if(newUser.password===req.body.spec_confirmPass){ 
      Spec.getUser(newUser.email_num,(error,user)=>{ 
       if(error) throw error; 
       if(!user){ 
        Spec.addUser(newUser,(err,user)=>{ 
         if(err){ 
          console.log("err"); 
          res.json({success:false,msg:"Somethings Went Wrong"}); 
         } else { 
          res.header("Content-Type","application/json"); 
          res.json({success:true,msg:"User Registered"}); 
         // res.redirect("/login"); 
         } 
        }); 
       }else{ 
        res.json({success:false,msg:"User Already Exists"}); 
       } 
      }); 
     }else{ 
      res.json({success:false,msg:"Password Not Confirmed"}); 
     } 
    }); 


    //Authentication route 
router.post('/authenticate', (req, res,next) => { 
     const email = req.body.email; 
     const password = req.body.password; 
     console.log("UserData"); 
     Model.findUser(email, (err, user) => { 
      console.log("UserData1"); 
      if(err) throw err; 
      if(!user){ 
      return res.json({success: false, msg: 'User not found'}); 
      } 
      Model.comparePassword(password, user.password, (err, isMatch) => { 
      console.log("UserData2"); 
      if(err) throw err; 
      if(isMatch){ 
       let payload={ 
       name:user.name, 
       email:user.email_num, 
       role:user.role, 
       deleted:user.deleted, 
       isActive:user.isActive, 
       created:user.created, 
       }; 
       let token = jwt.sign(payload,config.JWT_SECRET,{ 
        expiresIn:1440 
       }); 

       Model.saveToken(email,user.role,token,(err,success)=>{ 
        if(err) return err; 
        console.log("Success"); 
        // res.setHeader('Authorization',token); 
        // res.cookie('Authorization',token); 
        res.json ({ success: true, token: token }); 
        // res.redirect("https://stackoverflow.com/users/user"); 
       }); 


      } else { 
       return res.json({success: false, msg: 'Wrong password'}); 
      } 
     }); 
    }); 
// res.redirect("/user"); 
}); 

router.use(function(req, res, next) { 
    console.log(req.headers); 
    let token = req.body.token || req.headers['auth'] || req.query.token || req.cookies.Authorization; 
    // console.log(token); 
     if (token) { 
     jwt.verify(token, config.JWT_SECRET, function(err, decoded) {  
      if (err) { 
       console.log(err); 
      return res.json({ success: false, message: 'Failed to authenticate token.' });  
      } else { 
      req.decoded = decoded;  
      next(); 
      res.render("user"); 
      } 
     }); 

     } else { 
     return res.status(403).json({ 
      success: false, 
      message: 'No token provided.' 
     }); 

     } 
    }); 

router.get("/user", (req,res)=>{ 
    res.render("user"); 
}); 




module.exports = router; 

作爲模板引擎我使用Handlebars.So與登記一切都好,但是當我試圖驗證服務器帶來

Error: Can't set headers after they are sent.

我知道我可以使用cookie,但我想遠離這一點。 對不起語言錯誤,感謝您的幫助。

沙发
0
0

Error: Can't set headers after they are sent.

這意味着您要向客戶端發送多個響應。

我想你只需要刪除您res.render("user");在最後中間件是這樣的:

router.use(function(req, res, next) { 
    console.log(req.headers); 
    let token = req.body.token || req.headers['auth'] || req.query.token || req.cookies.Authorization; 
    // console.log(token); 
     if (token) { 
     jwt.verify(token, config.JWT_SECRET, function(err, decoded) {  
      if (err) { 
       console.log(err); 
      return res.json({ success: false, message: 'Failed to authenticate token.' });  
      } else { 
      req.decoded = decoded; 
      // Go next and delete res 
      next(); 
      // res.render("user"); 
      } 
     }); 

     } else { 
     return res.status(403).json({ 
      success: false, 
      message: 'No token provided.' 
     }); 

     } 
    }); 

希望它能幫助。

+1

這些都是Ctrl + C和Ctrl + V的效果。非常感謝您的快速和有效的答案。))))))))我會檢查它是正確的。 –

0
votes
answers
7 views
+10

我不能在阿賈克斯

1

返回的數據我不能從使用Ajax控制器的響應,我該怎麼辦?:我不能在阿賈克斯

$("document").ready(function(){ 
    $("#send").click(function(e){ 
     e.preventDefault(); 
     var question = $("input[name=question]").val(); 
     $.ajax({ 
      type: "POST", 
      url : "/Admin/question/store?token={{$t}}", 
      data : {'question':question}, 
      success : function(data){ 
       alert(data); 
       console.log(data); 
      } 
     }); 
    }); 
}); 

,並在控制器我只是想返回一個字符串來進行測試:

public function store(Request $request) 
      { 
      return "success"; 
      } 
+1

爲了給你一個很好的答案,它可以幫助我們,如果你有一個問題,如果你還沒有看過。如果你可以提供[mcve],它可能也很有用。 – Mat

+1

要做的事情測試: 1)在網絡中檢查您的瀏覽器開發工具,通過XHR過濾並查看發送的請求,以及任何錯誤或響應代碼 2)在構造函數中添加一個'dd()'的控制器,以確保它被稱爲 –

+1

正如@MehrdadDastgir所說,首先嚐試並檢查相同的帖子,但使用普通帖子,並驗證它的工作原理。然後你可以在它上面建立更復雜的事情,比如ajax調用。 – Amarnasan

沙发
0
0

我解決了它,

第一個問題是URL,我把它改爲:

{!! route('store') !!} 

,不知道寫在API我的路線! !而不是網絡

板凳
0
0

爲了在AJAX中獲得響應,您必須打印數據,返回後是否打印?如果沒有,請嘗試:

public function store(Request $request) 
{ 
    echo "success"; 
} 
+0

我什麼都沒有嘗試過。 –

0
votes
answers
7 views
+10

執行雙AJAX調用

-1

我已經開始了我的第一個AJAX項目,並且我正在嘗試編寫雙AJAX函數,其中第一個函數的輸出字符串(「venue_ID」)被第二個AJAX函數用於輸出字符串(img_Url)。但我沒有取得任何成功。對於我的代碼下面的任何建議將不勝感激;執行雙AJAX調用

$(function(){ 
 
var api_url = 'https://api.foursquare.com/v2/venues/search?ll=4.89996,114.928457&client_id=DKVNHNM2I15Y0TF1RNAEF1FPQHJPCCUPHBMJKGFHXUQITWHC&client_secret=XLCPTHFDAVNTUUAOCMNDQLWAS4TXZOGAXV5A2L1AAK5QNJZS&v=20131016&query=bake+culture'; 
 
var $info = $('#info'); 
 

 
$.ajax({ 
 
    type: 'GET', 
 
    url: api_url, 
 
    data: {format: 'json'}, 
 
    dataType: 'json', 
 
    success: function (info) { 
 
     var response = info.response.venues[0]; 
 
     var venue_id = response.id; 
 
     console.log('success', info); 
 

 
     $info.append(venue_id); 
 
     var $pic = $('#pic'); 
 

 
     var baseUrl = 'https://api.foursquare.com/v2/venues/'; 
 
     var fsParam = '/?client_id=DKVNHNM2I15Y0TF1RNAEF1FPQHJPCCUPHBMJKGFHXUQITWHC&client_secret=XLCPTHFDAVNTUUAOCMNDQLWAS4TXZOGAXV5A2L1AAK5QNJZS&v=20131016'; 
 
     var picUrl = baseUrl + venue_id + fsParam; 
 

 
     $.ajax({ 
 
      type: 'GET', 
 
      url: picUrl, 
 
      data: {format: 'json'}, 
 
      dataType: 'json', 
 
      success: function (pic) { 
 
       var venue_data = pic.response.venue; 
 
       var img_url = venue_data.bestPhoto.prefix + '192x144' + venue_data.bestPhoto.suffix; 
 
       console.log('success', pic); 
 

 
       $pic.append(img_url); 
 
      } 
 
     }); 
 
    } 
 
}); 
 
});
<html lang='en'> 
 
    <head> 
 
    <title>AJAX Demo</title> 
 
    </head> 
 
    <body> 
 
    <div> 
 
     <h4>AJAX Demo</h4> 
 
     <div id="info"></div> <!-- To test 1st AJAX output --> 
 
     <div id="pic"></div> 
 
    </div> 
 
    <div><img src="pic"></div> 
 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script> 
 
<script type="text/javascript" src="js/source.js"></script> 
 
</body> 
 
</html>

+0

'var venue_id'只在回調中定義,所以它不能在外面訪問。但即使你解決了這個問題,它仍然無法工作,因爲Ajax請求是異步的。 –

+0

[爲什麼我的變量在函數內部修改後沒有改變? - 異步代碼引用](https://stackoverflow.com/questions/23667086/why-is-my-variable-unaltered-after-i-modify-it-inside-of-a-function-asynchron) –

+0

可能的重複[如何在.then()鏈中訪問先前的承諾結果?](https://stackoverflow.com/questions/28250680/how-do-i-access-previous-promise-results-in-a-then-鏈) –

沙发
0
0

您的代碼不適合,原因有二:

  1. 變量venue_id在Ajax回調函數的範圍定義,它是外部不確定函數
  2. Ajax調用異步執行,即執行$.ajax語句後的代碼被執行立即在Ajax調用返回場所ID之前。

有很多方法可以解決這個問題,並且有很多關於Stack Overflow的相關問題。你的情況,最簡單的解決將是移動第二Ajax調用第一個Ajax調用的回調函數,就像這樣:

$(function(){ 
    var api_url = 'https://api.foursquare.com/v2/venues/search?ll=4.89996,114.928457&client_id=DKVNHNM2I15Y0TF1RNAEF1FPQHJPCCUPHBMJKGFHXUQITWHC&client_secret=XLCPTHFDAVNTUUAOCMNDQLWAS4TXZOGAXV5A2L1AAK5QNJZS&v=20131016&query=bake+culture'; 
    var $info = $('#info'); 

    $.ajax({ 
     type: 'GET', 
     url: api_url, 
     data: {format: 'json'}, 
     dataType: 'json', 
     success: function (info) { 
      var response = info.response.venues[0]; 
      var venue_id = response.id; 
      console.log('success', info); 

      $info.append(venue_id); 
      var $pic = $('#pic'); 

      var baseUrl = 'https://api.foursquare.com/v2/venues/'; 
      var fsParam = '/?client_id=DKVNHNM2I15Y0TF1RNAEF1FPQHJPCCUPHBMJKGFHXUQITWHC&client_secret=XLCPTHFDAVNTUUAOCMNDQLWAS4TXZOGAXV5A2L1AAK5QNJZS&v=20131016'; 
      var picUrl = baseUrl + venue_id + fsParam; 

      $.ajax({ 
       type: 'GET', 
       url: picUrl, 
       data: {format: 'json'}, 
       dataType: 'json', 
       success: function (pic) { 
        var venue_data = pic.response.venue; 
        var img_url = venue_data.bestPhoto.prefix + '192x144' + venue_data.bestPhoto.suffix; 
        console.log('success', pic); 

        $pic.append(img_url); 
       } 
      }); 
     } 
    }); 
}); 
+0

謝謝!你的建議對我有用 –

板凳
0
0
  1. 有幾種方法來解決異步問題。

a/JS中的本地方式是嵌套回調函數調用。參考XMLHttpRequest()對象作爲參考,以及它們的onreadystatechange屬性。

一旦您更好地理解了JS中的本地API調用,您可以使用jQuery提供的快捷方式,承諾或async/wait。所有這些在Stack Overflow和其他網站都有詳細記錄。

b如果您決定使用jQuery,則需要在第一個AJAX調用中接下來的第二個AJAX調用,即在第一個AJAX調用成功後的指令中。這個結構被稱爲「嵌套」。

c最後,您可以使用async/wait提供的工具。

  1. 您的變量venue_id應該定義爲任何函數之外的全局變量,以便它可以在另一個函數中使用。 但是如果你使用嵌套回調,你應該沒有問題,並且不需要全局變量。
+0

謝謝特里斯坦。我已經谷歌搜索項目1和2。感謝@Patrick Hund,感謝嵌套函數。仍然試圖圍繞XMLHttpRequest()包裝我的頭。也許我仍然在嘗試熟悉JS術語。 幸運的是,我發現使用「var $ pic = $('#pic');」作爲HTML使用的全球聲明。但圖像輸出通過「

」變爲空白。是否因爲它不是格式不正確的格式? –

0
votes
answers
7 views
+10

人幫助我一下AJAX JSON

-1

我存儲在笨電腦板「迴應」,此數據:人幫助我一下AJAX JSON

{ 
    "ok": false, 
    "messages": { 
    "cgusrnm": "<p class="text-danger">The Full Name field is required.</p>", 
    "cgnnm": "<p class="text-danger">The Nick Name field is required.</p>", 
    "cgeml": "<p class="text-danger">The Email Address field is required.</p>", 
    "cgunm": "<p class="text-danger">The User Name field is required.</p>", 
    "cgpsd": "<p class="text-danger">The Password field is required.</p>", 
    "ccgpsd": "<p class="text-danger">The Confirm Password field is required.</p>", 
    "cgcnm": "<p class="text-danger">The Company Name field is required.</p>", 
    "cgadr": "<p class="text-danger">The User Address field is required.</p>", 
    "cgct": "<p class="text-danger">The City field is required.</p>", 
    "cgcnt": "<p class="text-danger">The Country field is required.</p>", 
    "cgzn": "<p class="text-danger">The State field is required.</p>", 
    "cgzc": "<p class="text-danger">The Zip Code field is required.</p>", 
    "cgpn": "<p class="text-danger">The Phone Number field is required.</p>", 
    "cgsn": "<p class="text-danger">The Skype Name field is required.</p>", 
    "pm": "<p class="text-danger">The Payment Method field is required.</p>", 
    "cgpeml": "<p class="text-danger">The Email Address field is required.</p>" 
    } 
} 

但AJAX文件無法讀取該陣列。

我的Ajax代碼:

$('#form_user').submit(function(e) { 
    e.preventDefault(); 

    var me = $(this); 

    $.ajax({ 
    url: me.attr('action'), 
    type: 'post', 
    data: me.serialize(), 
    datatype: 'json', 
    success: function(response) { 
     if (response.ok == true) { 
     alert('response'); 
     } else { 
     $.each(response.messages, function(key, value) { 
      var element = $('#' + key); 
      element.after(value); 
     }); 
     } 
    } 
    }); 
}); 

請幫助我。

+0

它可能是'response.data.ok'。 'console.log'取出'response'的值並調查它的結構。 – ceejayoz

+0

我在本教程中流動https://youtu.be/H1sHOvc8au0 – Abdullah

+0

我沒有看YouTube教程來回答這個問題。使用'console.log'來查看'response'的值是什麼。相應地調整代碼。 – ceejayoz

沙发
0
0

消息不是數組而是對象。 JSON數組看起來像{message:[「a」,「b」]}

+0

以便我如何正確完成我的工作 – Abdullah

+0

爲什麼無法工作我的代碼?我流這個教程https://youtu.be/H1sHOvc8au0 – Abdullah

板凳
0
1

即使數據類型是json,response變量的類型仍然是字符串。嘗試添加response = JSON.parse(response);將字符串轉換爲JavaScript對象。

+0

非常感謝你。 – Abdullah

+0

原因是你稱它爲'datatype'而不是'dataType'。 'datatype'不做任何事情。您可以擺脫'JSON.parse'並將其更改爲'dataType'。 –

+0

謝謝大衛,我想知道爲什麼它不起作用。我很困惑... –

0
votes
answers
7 views
+10

將AJAX GET響應的一部分(以JSON形式)存儲到字符串變量中的問題

0

我試圖通過AJAX將GET請求的一部分結果存儲到字符串變量中時出現問題。將AJAX GET響應的一部分(以JSON形式)存儲到字符串變量中的問題

基本上,我想使它包含GET請求操作的某個函數將返回該操作的結果。

var count = 0; 

$.getJSON("https://api.icndb.com/jokes/count", function(data){ 
    count = data.value+1; 
    for (i = 1; i < count; i++){ 
     if (i != 1) { 
      setTimeout(jokeGet, i*7500, i); 
     } 
     else { 
      jokeGet(i); 
     } 
    } 
}); 

function jokeGet(n) { 
    var str = ""; 
    $.getJSON("https://api.icndb.com/jokes/" + n, function(data){ 
     if (data.type != "NoSuchQuoteException") { 
      $(".joke").html(data.value.joke); 
      str = data.value.joke; 
     } 
     else { 
      count++; 
     } 
    }); 

    return str; 
} 

API我正在發出請求以將信息存儲在JSON樹中。下面是這種樹的兩個例子:

{ "type": "success", "value": { "id": 1, "joke": "Chuck Norris uses ribbed condoms inside out, so he gets the pleasure.", "categories": ["explicit"] } } 

{ "type": "NoSuchQuoteException", "value": "No quote with id=8." } 

但是,每當我運行單元測試(通過QUnit),事實證明,在任何及所有情況下,jokeGet()函數返回一個空字符串。這是我覺得很奇怪的事情,因爲我認爲str = data.value.joke系列會讓它變成這樣,這個笑話被存儲在變量str中。

顯然,因爲str總是以空字符串的形式返回,所以情況並非如此。有什麼建議,爲什麼這是?

更新

考慮到的是什麼,我現在在做的目的不是爲了讓程序工作,但做單元測試,以證明程序工作,我已決定將「單元測試」文件:

QUnit.test("cn_jokes", function(assert) { 
    function joke(n, expected) { 
     assert.equal(jokeGet(n), expected); 
    } 
    joke(1, "Chuck Norris uses ribbed condoms inside out, so he gets the pleasure."); 
    joke(8, undefined); 
    joke(163, "Ninjas want to grow up to be just like Chuck Norris. But usually they grow up just to be killed by Chuck Norris."); 
    joke(221, "Chuck Norris is the only person to ever win a staring contest against Ray Charles and Stevie Wonder."); 
    joke(352, "Chuck Norris doesn't see dead people. He makes people dead."); 
    joke(502, "Chuck Norris insists on strongly-typed programming languages."); 
    joke(526, "No one has ever pair-programmed with Chuck Norris and lived to tell about it."); 
    joke(598, "Once Chuck Norris and Superman had a competition. The loser had to wear his underwear over his pants."); 
}); 

正如你可以看到,我想獲得的jokeGet()功能,具體,返回笑話值。請讓我知道這是否可能。

沙发
0
2

$.getJSON是異步的前返回值;您的代碼將在請求發出時繼續運行。正因爲如此,str很久之前通過您傳遞給getJSON運行的回調返回。你或許應該有jokeGet需要一個回調函數,並調用它的請求完成(通過data.value.joke作爲參數)時:

function jokeGet(n, callback) { 
    $.getJSON("https://api.icndb.com/jokes/" + n, function(data){ 
     if (data.type != "NoSuchQuoteException") { 
      $(".joke").html(data.value.joke); 
      if (callback !== undefined && callback !== null) 
       callback(data.value.joke); 
     } 
     else { 
      count++; 
      if (callback !== undefined && callback !== null) 
       callback(undefined); // not sure if you want undefined or "" in this case 
     } 
    }); 
} 

編輯:您可以使用異步回調與QUnit。如上所述,只需使用assert.async()here

QUnit.test("cn_jokes", function(assert) { 
    var done = assert.async(); 
    var jokesDone = 0; 
    var numJokes = 8; // make sure to change this if you add more 
    function joke(n, expected) { 
     jokeGet(n, function(j) { 
      assert.equal(j, expected); 
      if (++jokesDone == numJokes) done(); 
     } 
    } 
    joke(1, "Chuck Norris uses ribbed condoms inside out, so he gets the pleasure."); 
    joke(8, undefined); 
    joke(163, "Ninjas want to grow up to be just like Chuck Norris. But usually they grow up just to be killed by Chuck Norris."); 
    joke(221, "Chuck Norris is the only person to ever win a staring contest against Ray Charles and Stevie Wonder."); 
    joke(352, "Chuck Norris doesn't see dead people. He makes people dead."); 
    joke(502, "Chuck Norris insists on strongly-typed programming languages."); 
    joke(526, "No one has ever pair-programmed with Chuck Norris and lived to tell about it."); 
    joke(598, "Once Chuck Norris and Superman had a competition. The loser had to wear his underwear over his pants."); 
}); 
+0

是否沒有辦法讓jokeGet()函數本身返回值? –

+0

@JMG不,不是真的。你可以讓'jokeGet'返回一個你用'data.value.joke'解決的'Promise',並用'await'在'async'函數中調用它。這可能會讓你的代碼看起來更加結構化,但對於像這樣簡單的東西來說,使用'await'看起來有點矯枉過正,IE並不支持它。 –

+0

@JMG剛剛注意到你的編輯。我會更新我的答案。 –

板凳
0
0

嘗試使用裏面的return語句,如果塊

if(condition){ 
return str; 
} else { 
return 
} 

我想這品行是由於JS的異步性質,GET請求完成

+0

無效。我猜是因爲jokeGet()裏面的函數(數據)。使用該策略,變量「str」被認爲是不屬於jokeGet()的變量,而是屬於與ajax調用相關的內部函數。 –

+0

嗯,你是對的,那麼你應該使用回調 –

0
votes
answers
6 views
+10

使用Ajax將數組從視圖傳遞到控制器,但是在操作時,數組顯示爲空

1

我正在將數組從視圖傳遞到使用Ajax的控制器,但操作時數組顯示爲空。使用Ajax將數組從視圖傳遞到控制器,但是在操作時,數組顯示爲空

這是我的代碼:

查看

$("#btn").click(function() { 
      debugger 
      arry = []; 
       $.ajax({ 
       type: "Post", 
       url: "/Main/CheckBoxes", 
       data: { Values: arr["48","47","46"] }, 
       success: function() { 
        alert("array: " + arry.join(', ')); 
       }, 
       error: function() { 
        alert("error"); 
       } 
      }) 


     }); 

行動

public ActionResult array(string[] Values) 
     { 
      for (int id = 0; id < Values.Length; id++) 
      { 
       string newID = Values[id]; 
      } 

     return View(); 
    } 
+0

'數據:{值: 「48」, 「47」, 「46」]},'和'加上傳統:真實;' –

+1

和動作方法的名字是'array',你在呼喚來自客戶端腳本的其他內容!!! – Shyju

沙发
0
1
jQuery.ajaxSettings.traditional = true; 

$("#btn").click(function() { 
      debugger 
      arry = []; 
       $.ajax({ 
       type: "Post", 
       url: "/Main/CheckBoxes", 
       data: { Values:["48","47","46"]},//just edit this line 
       success: function() { 
        alert("array: " + arry.join(', ')); 
       }, 
       error: function() { 
        alert("error"); 
       } 
      }) 


     }); 
+0

動態創建該數組使用jquery和數組創建成功,如果我這樣發送數組({值:arry.join(',')})arry有值,但是當我發送像這樣的數組({值:arry} )其顯示空陣列? –

+0

data:{Values:arry} –

板凳
0
1

您的代碼對於你是如何發送數據的一些問題!當你執行這個表達式時你期望什麼arr["48","47","46"] ?????這將給你undefined,這就是你想要發送!

有兩種方法可以修復您的代碼。您可以在請求正文中發送數組。爲此,您需要從數組中創建一個JSON字符串,並將其作爲data屬性發送,同時將請求內容類型標頭值顯式指定爲「application/json」。您可以使用JSON.stringify方法來獲取js數組的JSON字符串。

此外,請確保您正在調用正確的操作方法。在您的問題中,您分享了array操作方法代碼,但在您的客戶端腳本中,您嘗試調用不同的操作方法(「複選框」)!

這應該工作。

var arry = ["48", "47", "46"]; 
var url = "@Url.Action("array", "Main")"; // Update your real url here 
// If your script is inside the razor view, you can us Url.Action (c#) method 

$.ajax({ 
    type: "Post", 
    url: url , 
    data: JSON.stringify(arry), 
    contentType: "application/json", 
    success: function(r) { 
     alert("Success"); 
     console.log(r); 
    }, 
    error: function() { 
     alert("error"); 
    } 
}); 

另一種選擇是發送javascript對象與屬性Values(其具有數組作爲它的值)作爲$.ajax呼叫的數據屬性值。現在請求內容類型頭將爲application/x-www-form-urlencoded;,並且該數組將在請求中作爲FormData發送。

var arry = ["48", "47", "46"]; 

$.ajax({ 
    type: "Post", 
    url: "/Main/array", 
    data: { Values: arry }, 
    success: function(r) { 
     console.log(r); 
    }, 
    error: function() { 
     alert("error"); 
    } 
}); 
+0

動態創建該數組並使用jquery,並且數組已成功創建,如果我發送數組,如下所示({Values:arry.join(',')})arry具有值,但是當我發送數組像這樣({Values:arry})其顯示空數組? –

+0

我剛剛用MVC5應用程序,jquery 3.2.1測試瞭解決方案的第二部分,它對我很有幫助。你有沒有嘗試第一個解決方案? – Shyju

0
votes
answers
6 views
+10

我正在做一個瑣事遊戲使用jquery/Ajax,但答案出現在錯誤的位置

0

我將盡力描述這一點,因爲我可以做出Ajax響應,它加載正常,但問題是所有每個問題的答案/選擇出現在錯誤的問題上。我正在做一個瑣事遊戲使用jquery/Ajax,但答案出現在錯誤的位置

確實有道理嗎?我會提供代碼 我應該在ajax請求中定位答案還是使另一個函數匹配正確的問題和答案?

'use strict'; 
 

 
$(document).ready(function() { 
 

 
    $.getJSON("json_data.json", function(obj) { 
 
    $.each(obj, function(key, value) { 
 
     $("div").append("<li>" + value.title + "</li><br/>"); 
 
     $.each(obj, function(key, value) { 
 
     $("div").append("<ul>" + value.choices + "</ul><br/>"); 
 

 

 
     }); 
 
    }); 
 
    }); 
 
});
{ 
 
    "q1": { 
 
      "title": "Superman is known as the world's greatest superhero. His alter-ego, Clark Kent, is a mild-mannered reporter for which newspaper?", 
 
	 	   "choices": ["The Daily Bugle" , "The Gotham Gazette","The Daily Planet","The Central City Citizen"], 
 
       "correctAnswer": 2 
 
     }, 
 

 
     "q2": { 
 
       "title": "John Constantine is a magician, demon-fighter, and all around do-gooder, but he's got one pretty serious vice. What is it?", 
 
       "choices": ["Gambling", "Overeating","Shoplifting","Cigarettes"], 
 
        "correctAnswer": 3 
 
       }, 
 

 
       "q3": { 
 
       "title": "She may be green, but she's got no reason to be jealous of anyone. In what universe is Guardian Gamora? ", 
 
       "choices": ["Marvel", 
 
       "Image", 
 
       "Vertigo", 
 
       "Top Shelf"], 
 
       "correctAnswer": 0 
 
      }, 
 
      "q4": { 
 
    "title": "Who paralyzed Barbara Gordon?", 
 
    "choices": ["Two-Face","ScareCrow","The Joker (My husband to be)","Solomon Grundy "], 
 
      "correctAnswer":2 
 
}, 
 
"q5": { 
 
"title": "What is Batman Incorporated?", 
 
"choices": ["Army of Bat-Bot's","Global crime-fighting organization"], 
 
      "correctAnswer":1 
 
},"q6": { 
 
"title": "Who is X-23?", 
 
    "choices":["New advanced Sentinel","Wolverine's mutant clone"], 
 
      "correctAnswer":1 
 
},"q7": { 
 
"title": "Which book does Hermione steal from Dumbledore's office?", 
 
      "choices":[ 
 
       "Magick Moste Evile", 
 
       "The Tales of Beedle the Bard", 
 
       "History of Magic", 
 
       "Nature's Nobility: a Wizarding Genealogy" 
 
      ], 
 
      "correctAnswer":0 
 
},"q8": { 
 
"title": "Who disguised himself as Mad Eye Moody in the TheGoblet of Fire?", 
 
      "choices":[ 
 
       "Barty Crouch Jr.", 
 
       "Ernie McMillian", 
 
       "Severus Snape", 
 
       "Vincent Crabbe" 
 
      ], 
 
      "correctAnswer":0 
 
},"q9": { 
 
"title": "Han Solo's trusty blaster is a:?", 
 
      "choices":[ 
 
       "C-3PO", 
 
       "D4-66", 
 
       "BB-88", 
 
       "DL-44" 
 
      ], 
 
      "correctAnswer":3 
 
},"q10": { 
 
"title": "Vader cuts off Luke's _____ hand?", 
 
      "choices":[ 
 
       "right", 
 
       "left", 
 
       "both" 
 
      ], 
 
      "correctAnswer":0 
 
} 
 
}
<!DOCTYPE html> 
 
<html lang="en"> 
 

 
<head> 
 
    <meta charset="utf-8" /> 
 
    <script src="jquery-3.2.1.min.js" type="text/javascript"></script> 
 
    <title>JSON jQuery AJAX</title> 
 
</head> 
 

 
<body> 
 
    <h1>COOl</h1> 
 

 
    <div></div> 
 

 
    <button id="submit" class="button">Submit Quiz</button> 
 

 

 
    <script src="my_script.js" type="text/javascript"></script> 
 
</body> 
 

 
</html>

+0

當然,內部循環應該遍歷與標題相關的「選擇」。 'obj'的嵌套迭代是無稽之談。 –

+0

可能會使您的片段首先工作 –

沙发
0
0

有這何處去錯了幾個地方。首先,有一個額外的循環,沒有理由在那裏。

$.getJSON("json_data.json", function(obj) { 
    $.each(obj, function(key, value) { 
     $("div").append("<li>" + value.title + "</li><br/>"); 
     $("div").append("<ul>" + value.choices + "</ul><br/>"); 
    }); 
    }); 

其次,用你的代碼。 jquery將標題和選擇添加到頁面上的所有div,這是我們不想要的。相反,創建一個id一個div讓jQuery將只追加到特定的div

$.getJSON("json_data.json", function(obj) { 
    $.each(obj, function(key, value) { 
     $("#specificDiv").append("<li>" + value.title + "</li><br/>"); 
     $("#specificDiv").append("<ul>" + value.choices + "</ul><br/>"); 
    }); 
    }); 

第三,從不附加元素到DOM中循環。這是一個非常糟糕的做法,因爲DOM的操作很慢且性能密集。相反,將所有你想要的html保存在一個變量中,並在最後追加一次。

var html = ''; 
$.getJSON("json_data.json", function(obj) { 
    $.each(obj, function(key, value) { 
     html += "<li>" + value.title + "</li><br/>"; 
     html += "<ul>" + value.choices + "</ul><br/>"; 
    }); 
    $("#specificDiv").append(html); 
}); 

最後,爲不同的元素使用正確的標籤。你已經使用li標籤作爲標題,並使用li而不包含ul或ol。而是使用跨度。使用正確的標籤有助於瀏覽器更快地構建DOM樹

0
votes
answers
6 views
+10

javascript:需要另一個異步函數結果的運行函數

0

我想從數據庫打印信息。 我這樣做: 我有它的全球陣列。 1.使用ajax的函數獲取請求到獲取所有記錄並將記錄數據放入全局數組的服務器。 2.打印來自全局數組的數據的函數。javascript:需要另一個異步函數結果的運行函數

var items = [] 
function initPage() { 
    getData();/function that gets data from database and put in array 
    printData();/function that prints data to html 
} 

我的問題是: 我在我的電腦上運行此所以它是所有正在運行的快,我沒有問題。 但是,如果我將所有移動到互聯網和查詢將運行較慢,我會有printData函數的問題?它可以在getData完成之前運行嗎? 或者它等待getData完成?

處理這種情況的最好方法是什麼?

感謝阿龍

+0

可以請你發佈你的函數'getData()'和'printData()'?您可以將'printData()'發送到'getData()',並在獲得響應時將其設置爲事件處理程序。 – TheMintyMate

沙发
0
1

是的,你可以很好的有問題,printData功能,因爲getData可能需要很長時間,甚至超時任何金額。

的Javascript的承諾就是在這樣的情況下,你最好的朋友:-)

getData函數應該做這樣的事情:

function getData() { 
    var url = 'http://blah.com/blah'; 
    return new Promise((resolve, reject) => { 
    const xhr = new XMLHttpRequest(); 
    xhr.open("GET", url); 
    xhr.onload =() => resolve(xhr.responseText); 
    xhr.onerror =() => reject(xhr.statusText); 
    xhr.send(); 
    }); 
} 

更改您這樣的代碼:

var items = [] 
function initPage() { 
    getData().then(
    function(data) { 
     printData(data); 
    }, 
    function(error) { 
     printMessage(error); 
    } 
); 
} 
0
votes
answers
6 views
+10

如何在PHP中正確構造並調用不同的類方法的類方法?

0

我正在寫一個WordPress插件,目前在管理端工作。我爲這個項目使用了類。我遇到的麻煩可能源於我的經驗不足。如何在PHP中正確構造並調用不同的類方法的類方法?

我有兩個班,一個是管理頁面,另一個處理自定義數據庫表的創建,刪除,查詢等

我認爲,爲了做一些數據庫操作,它將使意義在tools_page方法被調用時創建表對象($ db)。這反映在下面的代碼中。但是,致電$ db-> create_update_tables()抱怨找不到$ db

如果我將$ db的創建移動到db_tables方法,代碼將運行。

我認爲,由於涉及的方法是公共的,$ db對象應該可用於管理頁面內的其他方法。我在研究的印象之下,首選的方法是在插件運行時聲明全局數據庫調用時使用的全局單一全局數據庫。如果我不正確,那麼做到這一點的正確方法是什麼?

管理類:

class Home_Search_Admin { 

    public function __construct($plugin_name, $version, $db_version) { 

     $this->plugin_name = $plugin_name; 
     $this->version = $version; 
     $this->db_version = $db_version; 

    } 

    public function db_tables() { 

     echo "Inside db_tables"; 
     $db->create_update_tables(); 
     wp_die(); 
    } 

    public function tools_page() { 

     include(plugin_dir_path(__FILE__) . 'partials/home-search-admin-display.php'); 
     $db = new Home_Search_Tables(); 
     $this->db_tables(); 
    } 
} 

的類表:

class Home_Search_Tables { 

    private $wpdb; 

    public function __construct() { 

     global $wpdb; 
     $this->wpdb = $wpdb; 
     print_r("Constructed!"); 

    } 

    public function create_update_tables() { 

     print_r('I am in the method!'); 

    } 
} 
+0

什麼警告/錯誤,你得到這個? (錯誤+日誌)。由於我們沒有看到整個聲明代碼,所以使用部分代碼可以很好地知道輸出日誌 –

+0

顯示代碼。當你不顯示實際實現 – TurtleTread

+0

@ Elvin85錯誤(PHP)是$ db對象沒有被定義的時候,所有這些解釋都不是很有幫助。我試圖在上面更好地解釋它。謝謝你的幫助。抱歉,我很慢回到你們身邊。我整天都在場外。 –

沙发
0
0

如果所需要的表類的唯一方法是你db_tables(),你可以做你說什麼。將$db的創建移動到db_tables方法。

但是,如果您需要創建所有方法都可以訪問,則需要在類Home_Search_Tables下聲明類似$wpbd的變量,以便您可以從方法傳遞它。

class Home_Search_Admin { 

private $db; // Declare $db 

在你的方法,使用$this->db

public function db_tables() { 

    echo "Inside db_tables"; 
    $this->db->create_update_tables(); // $this->db 

同樣在這裏

public function tools_page() { 

    include(plugin_dir_path(__FILE__) . 'partials/home-search-admin-display.php'); 
    $this->db = new Home_Search_Tables(); // $this->db 
    // Or you can move this creation to construct method if necessary 
+0

通過@TurtleTread將上面的註釋與上面的註釋相結合,讓我看到了我思想的簡單錯誤:忘記我需要聲明$ db! –

0
votes
answers
6 views
+10

CodeIgniter:如何在RESTful Server上接收序列化數組中的數據?

0

我想問,如何從CodeIgniter RESTful Server上的數組中的序列化數據接收數據?CodeIgniter:如何在RESTful Server上接收序列化數組中的數據?

阿賈克斯

$.ajax({ 
    type: 'POST', 
    url: "/mywebsite/api/index.php/purchase", 
    data: $("#formdatatrans").serialize(), 
    success: function(response) { 
     alert("Success"); 
    } 
}); 

HTML表單

<input type="text" name="data1[]"> 
<input type="text" name="data2[]"> 
<input type="text" name="data3[]"> 
<input type="text" name="data4[]"> 

控制器

function index_post() {  
$data = array(
      'data1'   => $this->post('data1'), 
      'data2'  => $this->post('data2'), 
      'data3'    => $this->post('data3'), 
      'data4' => $this->post('data4')); 
$insert = $this->db->insert('table1', $data); 
if ($insert) { 
$this->response($data, 200); 
} else { 
$this->response(array('status' => 'fail', 502)); 
}} 

輸入數據

Array [0] 
Data1 = abc_1 
Data2 = abc_1 
Data3 = abc_1 
Data4 = abc_1 

Array [1] 
Data1 = abc_2 
Data2 = abc_2 
Data3 = abc_2 
Data4 = abc_2 

如何使用/循環的同時,一次性添加所有的數據之上?

在此先感謝

沙发
0
0

您可以使用梅傑斯與梅傑斯你可以兩個數組轉換爲數組

<?php 
$array1 = array('Data1' =>"abc_1",'Data2' =>"abc_1",'Data3' =>"abc_1",'Data4' =>"abc_1"); 
$array2=array('Data5' =>"abc_2",'Data6' =>"abc_2",'Data7' =>"abc_2",'Data8' =>"abc_2"); 
$data = array_merge($array1, $array2); 
print_r($output); 
?> 
板凳
0
0

這個替換您的控制器和檢查,這將使用幫助您一次插入foreach循環。

function index_post() {  

    $data1 = $this->post('data1'); 
    $data2 = $this->post('data2'); 
    $data3 = $this->post('data3'); 
    $data4 = $this->post('data4'); 

    foreach ($data1 as $key=> $value) { 
     $data['data1'] = $data1[$key]; 
     $data['data2'] = $data2[$key]; 
     $data['data3'] = $data3[$key]; 
     $data['data4'] = $data4[$key]; 
     $insert = $this->db->insert('table1', $data); 
    } 

    if ($insert) { 
     $this->response($data, 200); 
    } else { 
     $this->response(array('status' => 'fail', 502)); 
    } 
}