“ WARN ไม่สามารถระบุความยาวเนื้อหาของเนื้อหาการตอบสนองได้” หมายความว่าอย่างไรและฉันจะกำจัดมันได้อย่างไร


320

ตั้งแต่อัพเกรดเป็น Rails 3.1 ฉันเห็นข้อความเตือนนี้ในบันทึกการพัฒนาของฉัน:

WARN ไม่สามารถระบุความยาวเนื้อหาของเนื้อหาการตอบสนอง ตั้งค่าความยาวเนื้อหาของการตอบกลับหรือชุดResponse#chunked = true

นี่หมายถึงอะไรและฉันจะลบออกได้อย่างไร มันเป็นปัญหาหรือไม่?


1
กันที่นี่สำหรับฉันมันเกิดขึ้นเมื่อมีการโทรระยะไกลผ่าน JS
ทิมบาส

2
ฉันเริ่มได้รับสิ่งนี้ทันทีที่ฉันอัพเกรดเป็น Ruby 1.9.3 วันนี้ ไม่เคยเห็นมาก่อน ฉันคิดว่ามันจะต้องเกิดจากการเปลี่ยนแปลงใน WEBrick ในรูบี 1.9.3 ...
ไทเลอร์ริก

50
มันเป็นปัญหาของ WEBrick ในระหว่างนี้คุณสามารถเพิ่ม 'thin' gem ใน Gemfile ของคุณและ boot Rails ด้วยแทนที่จะเป็น WEBrick เช่นrails s thin; Ta-da! ไม่มีคำเตือนอีกแล้ว
Scott

คำตอบ:


229

ถามคำถามเดียวกันกับสมาชิกของ Rails-Core:

https://twitter.com/luislavena/status/108998968859566080

และคำตอบ:

https://twitter.com/tenderlove/status/108999110136303617

ใช่มันไม่เป็นไร จำเป็นต้องทำความสะอาด แต่ก็ไม่มีอะไรถูกทำร้าย


9
ถ้าข้อความรบกวนคุณคุณสามารถใช้ thin (เพิ่มgem 'thin'ใน gemfile ของคุณเพื่อเริ่มต้นเซิร์ฟเวอร์โดยใช้rails server thin) (อุ๊ปส์เพิ่งสังเกตเห็นว่า @Scott Lowe ได้กล่าวถึงเรื่องนี้ไปแล้ว)
fearless_fool

280
ฉันพบว่ามันน่ารำคาญเมื่อสิ่งเหล่านี้ถูกจัดอยู่ในหมวดหมู่ของ "ไม่มีอะไรได้รับบาดเจ็บ" ข้อเท็จจริงที่ว่ามีคนหลายพันคนกำลังเสียเวลาที่จะคิดออกว่าเกิดอะไรขึ้นก็เพียงพอที่จะโต้แย้งว่า
Mark Fraser

16
@ KenThompson ปัญหาคือ Webrick ไม่ใช่ Rails Webrick ไม่รองรับการเชื่อมต่อแบบ keep-alive และทำให้เกิดคำเตือน / ปัญหาที่เราเห็น ขอแนะนำให้คุณใช้เว็บเซิร์ฟเวอร์ที่เหมาะสม / ดีกว่า (เช่นแบบบางหรือแบบสแตนด์อโลนของผู้โดยสาร) สำหรับเว็บ Ruby รุ่นที่กำลังจะมาถึงจะแก้ไขปัญหานี้
Luis Lavena

3
เว็บเซิร์ฟเวอร์บนพีซีการพัฒนาของเราแสดงผลไฟล์. js.erb เดียวกันสองครั้ง ปัญหาการเรนเดอร์สองครั้งจะหายไปในเซิร์ฟเวอร์ที่ใช้งานจริงซึ่งใช้งาน nginx ดังนั้นนี่คือปัญหาจริงในกรณีเช่นของเรา
user938363

2
คำตอบควรมีเนื้อหาของการโพสต์ทวิตเตอร์แทนการเชื่อมโยง
Pedro Rolo

78

โปรแกรมแก้ไขต่อไปนี้แก้ไขปัญหาได้ในกรณีของฉัน ไม่มีคำเตือนสำหรับฉันอีกแล้ว

204_304_keep_alive.patch

เพียงแก้ไขไฟล์ httpresponse.rb ที่บรรทัด 205 ดังแสดงในลิงค์ด้านบน ในความเป็นจริงลิงก์แสดงการแก้ไขที่ทำกับทับทิมในอนาคต

ฉันใช้ rails 3.2.0 กับ ruby ​​1.9.3-p0 ติดตั้งผ่าน RVM ในฐานะผู้ใช้คนเดียว ดังนั้นตำแหน่งในกรณีของฉันคือ:

~/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/1.9.1/webrick/httpresponse.rb

ตำแหน่งของไฟล์ที่จะเปลี่ยนแปลงนั้นแตกต่างกันไปตามประเภทของการติดตั้ง RVM หรือไม่หรือแม้กระทั่งผู้ใช้หลายคนหรือผู้ใช้คนเดียวดังนั้นฉันจะให้ส่วนสุดท้ายของมัน:

.../ruby-1.9.3-p0/lib/ruby/1.9.1/webrick/httpresponse.rb

ฉันหวังว่านี่จะเป็นประโยชน์กับใครบางคน

แก้ไข: นี่คือลิงค์ไปยังความมุ่งมั่นที่แก้ไขบรรทัดที่เป็นปัญหาในสาขาลำต้นของโครงการทับทิม


ฉันใช้เดเบียนบีบ, ติดตั้งทับทิมรุ่น 1.9.3p194, และปัญหานี้ยังคงเกิดขึ้น. Ruby ลงวันที่ 2012-04-20 และ patch ของ Tenderlove ลงวันที่ Tue Dec 13 07:30:14 2011 แต่ยังคงเกิดขึ้น
kristianp

สำหรับ Debian squeeze Ruby รุ่น 1.9.3-p327 ที่ติดตั้ง RVM ยังคงให้คำเตือนที่เป็นปัญหาเหล่านี้อยู่
MarkDBlackwell

56

เพียงเพิ่ม Gem ไปยัง Gemfile อย่างชัดเจนเพื่อลบข้อความเตือนให้ฉัน:

group :development do
  gem 'webrick', '~> 1.3.1'
end

5
ใช่สำหรับฉันเช่นกัน สาเหตุที่ทำให้งานนี้อยู่ในFeature # 5481 Gemifying Ruby ไลบรารีมาตรฐาน : "เนื่องจาก 'fake gems' ไฟล์ใหม่ของ stdlib ที่ติดตั้งโดย 'gem update' จะถูกละเว้นเว้นแต่ผู้ใช้เขียน gem ['webrick'] อย่างชัดเจน ."
MarkDBlackwell

2
มันดีกว่า 'ละเว้นมัน' หรือ 'patch webrick' ขอบคุณ!
nessur

54

คุณยังสามารถใช้ Thin แทน Webrick เริ่มต้นได้ เพิ่มไปยังGemfile gem 'thin'

จากนั้นrails s thinจะใช้ thin และคำเตือนจะหายไป


ใช่. นี่คือสิ่งที่ฉันทำลงไปในไม่กี่เดือนที่ผ่านมา Ryan Bates ยังกล่าวถึงใน Railscast ล่าสุด
Nate Bird

1
@cam เพลง: เกือบถูกต้อง: รางบางจะใช้ thin แทน Webrick และคำเตือนจะหายไป
fearless_fool

1
ฉันอยู่thinในdevelopmentกลุ่ม Rails 4 ดูเหมือนจะหยิบมันขึ้นมาโดยอัตโนมัติเมื่อทำงานrails s
วาด

15

หากคุณใช้. rvm ให้ทำเช่นนี้เพื่อแก้ไข ...

ดังที่João Soaresให้เครดิตแก่เขานี่คือสิ่งที่คุณสามารถทำได้ถ้าคุณไม่กำจัดคำเตือนเกี่ยวกับการพัฒนา

  1. ใช้เครื่องมือแก้ไขที่คุณชื่นชอบเพื่อเปิดไฟล์นี้:

    ~/.rvm/rubies/<ruby-version>/lib/ruby/1.9.1/webrick/httpresponse.rb
  2. ไปที่บรรทัดที่มีสิ่งนี้ (สำหรับฉันมันคือเส้น 206):

    if chunked? || @header['content-length']
  3. เปลี่ยนจากแพทช์นี้เป็น:

    if chunked? || @header['content-length'] || @status == 304 || @status == 204
  4. บันทึกไฟล์และรีสตาร์ทเซิร์ฟเวอร์รางของคุณในที่สุด


1
ขอบคุณ! เป็นline 107สำหรับฉัน
gbdev

12

ปัญหานี้ได้รับการแก้ไขแล้วในสาขาลำต้นของรูบี้ด้วยการกระทำนี้ให้กับเว็บrick

คุณสามารถแก้ไขไฟล์ webrick นี้ในทำนองเดียวกันในการตั้งค่าของคุณ ตำแหน่งโดยประมาณสามารถพบได้โดย:

gem which webrick

หากต้องการแก้ไขไฟล์จริง:

nano \`ruby -e"print %x{gem which webrick}.chomp %Q{.rb\n}"\`/httpresponse.rb

(หรือแทนนาโนใช้โปรแกรมแก้ไขที่คุณชื่นชอบ)


บรรทัดคำสั่งแฟนซีของฉันข้างต้น (ตลกรวมทั้งแก้ไขนาโน) ถูกยกขึ้นโดยไม่ต้องระบุแหล่งที่มาและที่มีลิขสิทธิ์ในเว็บไซต์ RailsRock ที่นี่
MarkDBlackwell

backticks อาจไม่ควรหนี ดังนั้นมันควรจะเป็น: nano `ruby -e"print %x{gem which webrick}.chomp %Q{.rb\n}"`/httpresponse.rb.
MarkDBlackwell

5

รุ่น JRuby: หากคุณใช้. rvm ให้ทำเพื่อแก้ไข ...

ดังที่João SoaresและKjellskiกล่าวไว้นี่คือสิ่งที่คุณสามารถทำได้หากคุณต้องการกำจัดคำเตือนเกี่ยวกับการพัฒนาและคุณกำลังใช้ JRuby

  1. ใช้เครื่องมือแก้ไขที่คุณชื่นชอบเพื่อเปิดไฟล์นี้:

    ~/.rvm/rubies/jruby-<version>/lib/ruby/<1.8 or 1.9>/webrick/httpresponse.rb
  2. ไปที่บรรทัดที่มีสิ่งนี้ (สำหรับฉันมันคือบรรทัด 205):

    if chunked? || @header['content-length']
  3. เปลี่ยนจากแพทช์นี้เป็น:

    if chunked? || @header['content-length'] || @status == 304 || @status == 204
  4. บันทึกไฟล์และรีสตาร์ทเซิร์ฟเวอร์รางของคุณในที่สุด


@schwabsauce ยกเว้นสำหรับการเรียนการสอนครั้งแรกส่วนที่เหลือไม่ได้เป็น JRuby เฉพาะ; ช่วยค้นหาไฟล์ คำแนะนำอื่น ๆ จะทำซ้ำเพื่อความชัดเจน
Crimbo

3

วิธีแก้ปัญหาอื่นที่ลบบรรทัดที่ละเมิดออกจาก webrick มันไม่มีประโยชน์เลย:

cd `which ruby`/../../lib/ruby/1.9.1/webrick/ && sed -i '.bak' -e'/logger.warn/d' httpresponse.rb

(คุณอาจต้องsudo)


3

เพิ่ม

config.middleware.use Rack::ContentLength

application.rbไฟล์ของคุณและคำเตือนจะหายไปแม้กับ webrick สิ่งนี้จะตั้งค่าContent-Lengthอย่างเหมาะสมในการผลิตเมื่อแสดง json หรือตอบกลับข้อความ


ฉันชอบความคิดในการแก้ปัญหาจริง ๆ แทนที่จะซ่อนไว้ด้วยแผ่นแปะที่ยังมีชีวิตอยู่ น่าเสียดายที่ข้อเสนอแนะนี้คายคำเตือนออกไปสองเท่า
เขาวงกต
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.