Score:0

Ubuntu 20.04.2 ไม่ทำงานกับ MySQL 8.0.27 .

ธง nc

ฉันไม่เคยมีปัญหานี้เมื่อใช้ Windows

ด้วยเหตุผลบางประการ ฉันไม่สามารถรับผลกระทบใดๆ ก็ตามเมื่อพยายามเชื่อมต่อกับฐานข้อมูล MySQL ในเครื่องจากแอป Node.js ในเครื่อง

ทุกอย่างทำงานได้ในโค้ดจนถึงการพยายามเชื่อมต่อกับ MySQL และทุกอย่างสามารถตรวจสอบย้อนกลับได้อย่างดี (สมมติว่ามีการใส่การกำหนด stub เพื่อทดแทนผลลัพธ์ที่ขาดหายไปจากการเรียก MySQL) หลังจากการเชื่อมต่อ MySQL

ฉันดูที่บันทึกของระบบและบันทึก MySQL อย่างไร้ประโยชน์เพื่อหาเงื่อนงำใด ๆ บางครั้งก็แนะนำว่า MySQL อาจปฏิเสธการเชื่อมต่อผ่านเครือข่าย แต่ใช้การเชื่อมต่อซ็อกเก็ตแทน ฉันปรับพารามิเตอร์การเชื่อมต่อตามนั้น (ไม่มีพอร์ต: ...., เพิ่ม socketPath: ....., รายการ) แต่ก็ไม่ดีขึ้น

ด้านล่างนี้เป็นรหัสทดสอบพื้นฐานสำหรับ

const mysql = ต้องการ ('mysql');


constqueryNodeAppData = (แบบสอบถาม) =>
{
  console.log("ในสคริปต์ MySQL Query ตอนนี้ ...")
  console.log("แบบสอบถาม:" + แบบสอบถาม);

  const con = mysql.createConnection(
  {
    โฮสต์: "localhost",
    socketPath: '/var/run/mysqld/mysqld.sock',
    ฐานข้อมูล: "nodeapp",
    ผู้ใช้: "รูท",
    รหัสผ่าน: "My.$qu3@1$y"
  });

  con.connect (ฟังก์ชั่น (errconn)
  {
    ถ้า (เออคอนน์) 
    {
        console.error('เกิดข้อผิดพลาดในการเชื่อมต่อ:' + errconn.stack);
        กลับ "ไม่ถูกต้อง";
    }
    อื่น
    {
        console.log('เชื่อมต่อเป็น id' + connection.threadId);
        ส่งคืน "ถูกต้อง"
    }
  });

};

module.exports = { แบบสอบถามNodeAppData };

เอาต์พุตเทอร์มินัลที่สอดคล้องกันหลังจากพยายามเรียกใช้แอพด้วย โหนด อยู่ด้านล่าง บันทึกคอนโซลถูกสร้างขึ้นเมื่อ app.js มอบหมายงานผู้ใช้ให้กับโมดูลอื่น เช่น เราเตอร์, ตัวจัดการ, ตัวตรวจสอบรูปแบบ, mysql และอื่น ๆ บางครั้งเอาต์พุตจะถูกบันทึก

ข้อผิดพลาดในท้ายที่สุดที่ทำให้แอปขัดข้องนั้นเกิดจากการพยายามเขียนค่าที่ไม่ได้กำหนดลงในตัวแปรตอบสนอง XHR ที่กำหนดโดยข้อความ การระงับการตอบกลับด้วยสตริงใด ๆ ทำให้แอปส่งคืนรหัสสถานะ 200 และไม่มีข้อผิดพลาด

[nodemon] เริ่มต้น `node app.js`
HTTP Server สำหรับ NodeApp เริ่มต้นที่พอร์ต 3000
เราอยู่ในส่วนหลังสุดของ NodeApp !
มีคน POSTed ข้อมูลไปยัง Node server ...
ปลายทางที่ตัดแต่ง URL: reg-user
ค่าอินพุต: tamjk
ใน router.js ตอนนี้ ...
ปลายทาง: ข้อมูลผู้ใช้ reg: tamjk
ตัวจัดการ: authen.js
ในตัวจัดการ authen.js ตอนนี้ ...
โหมด: reg ฟิลด์: ค่าผู้ใช้: tamjk
ในการตรวจสอบรูปแบบในขณะนี้ ...
ข้อความตรวจสอบรูปแบบ: รูปแบบที่ถูกต้อง
กำลังเชื่อมต่อกับฐานข้อมูลผู้ใช้ ตรวจสอบ user ...
ในสคริปต์ MySQL Query ตอนนี้ ...
ข้อความค้นหา: เลือกผู้ใช้จากผู้ใช้ โดยที่ผู้ใช้ = 'tamjk'
เราเตอร์ส่งคืนข้อความ undefined
ข้อความโทรกลับ: ไม่ได้กำหนด
ข้อความ: undefined
ส่งการตอบกลับ: ไม่ได้กำหนด
_http_outgoing.js:696
    โยนใหม่ ERR_INVALID_ARG_TYPE('อาร์กิวเมนต์แรก'
    ^

TypeError [ERR_INVALID_ARG_TYPE]: อาร์กิวเมนต์แรกต้องเป็นประเภทสตริงหรืออินสแตนซ์ของ Buffer หรือ Uint8Array ได้รับไม่ได้กำหนด
    ที่เขียน_ (_http_outgoing.js:696:11)
    ที่ ServerResponse.write (_http_outgoing.js:661:15)
    ที่ reqCallback (/home/sandbar/Desktop/nodeapp-local/app.js:116:6)
    ที่ข้อความขาเข้า <ไม่ระบุตัวตน> (/home/sandbar/Desktop/nodeapp-local/app.js:87:10)
    ที่ IncomingMessage.emit (events.js:327:22)
    ที่ endReadableNT (_stream_readable.js:1327:12)
    ที่ processTicksAndRejections (ภายใน/กระบวนการ/task_queues.js:80:21) {
  รหัส: 'ERR_INVALID_ARG_TYPE'
}
แอป [nodemon] ขัดข้อง - กำลังรอการเปลี่ยนแปลงไฟล์ก่อนที่จะเริ่ม...

เช่นเดียวกับปัญหาข้างต้น ฉันเริ่มไม่ได้รับความร่วมมือเมื่อฉันพยายามเข้าถึงฐานข้อมูล MySQL จากเทอร์มินัล

$ sudo mysql
[sudo] รหัสผ่านสำหรับแซนด์บาร์: 
ข้อผิดพลาด 1045 (28000): การเข้าถึงถูกปฏิเสธสำหรับผู้ใช้ 'root'@'localhost' (โดยใช้รหัสผ่าน: NO)

สรุปแล้วฉันสงสัยว่า Ubuntu 20.04.2 และ MySQL 8.0.27 นั้นทำงานร่วมกันได้จริงหรือไม่

in flag
คุณไม่สามารถเชื่อมต่อกับการติดตั้ง MySQL บนลีนุกซ์รุ่นใหม่ส่วนใหญ่ในฐานะ 'รูท' โดยไม่ใช้ super user วิธีที่ง่ายที่สุด â และมาตรฐานอุตสาหกรรม â คือการสร้างผู้ใช้ MySQL สำหรับเว็บไซต์และใช้ข้อมูลประจำตัวเหล่านั้น
Trunk avatar
nc flag
ลองใช้บัญชีผู้ใช้ที่ไม่ใช่รูทที่ฉันสร้างไว้ใน MySQL แล้ว แต่ฉันไม่ได้ลองสิ่งนี้ด้วยการเชื่อมต่อซ็อกเก็ต ฉันคิดว่ามันต้องเป็นการเชื่อมต่อซ็อกเก็ตสำหรับการเข้าถึงเครื่องท้องถิ่น? หรือสามารถกำหนดค่าให้อนุญาตการเข้าถึง TCP/IP ได้หรือไม่
in flag
หากเป็นการเชื่อมต่อแบบโลคอล คุณจะเลือกใช้ซ็อกเก็ตหรือ `127.0.0.1` ได้ดี ใครเป็นผู้กำหนดค่าเซิร์ฟเวอร์ `sudo mysql` โดยทั่วไปไม่ต้องใช้รหัสผ่าน เพราะถ้าคุณใช้ `sudo` บนเครื่อง Linux ได้ คุณต้องเป็นผู้ดูแลระบบของเซิร์ฟเวอร์ หากเซิร์ฟเวอร์ได้รับการกำหนดค่าผิด แสดงว่ามีประมาณครึ่งล้านสิ่งที่ต้องตรวจสอบและยืนยันเพื่อหาสาเหตุที่การเชื่อมต่อล้มเหลว
Trunk avatar
nc flag
มันอยู่ใน localhost แล้ว ซึ่งปกติก็เหมือนเดิม การกำหนดค่าใดๆ อาจเป็นค่าดีฟอลต์หรือผู้ใช้เพิ่มเติม สิทธิพิเศษ ฯลฯ ที่ฉันเพิ่มเข้าไป ฉันหวังว่าเอกสาร MySQL ให้มากกว่านี้ Lotentaré mañana.
Trunk avatar
nc flag
ฉันลบและติดตั้ง MySQL ใหม่ จากนั้นฉันสร้างผู้ใช้ใหม่สำหรับ mysql โดยมีสิทธิ์จำกัดเฉพาะฐานข้อมูลของแอป Node การเชื่อมต่อกับเซิร์ฟเวอร์ MySQL ทำโดยใช้ MySQL Workbench และเลือกการเชื่อมต่อ TCP/IP ตาราง Users อย่างง่ายถูกสร้างขึ้นและเติมข้อมูลเพียงเพื่อทดสอบการเข้าถึงจากแอป Node ไปยังตาราง MySQL nodeapp.usersไม่มีการเข้าถึงใด ๆ ไม่พบการเชื่อมต่อกับข้อผิดพลาด MySQL ข้อผิดพลาดข้อขัดข้องก็เหมือนเดิม - พยายามเขียนค่า UNDEFINED ไปยังการตอบสนอง XHR ฉันสงสัยว่า Oracle ต้องการให้แอป Node เข้าถึง MySQL ได้อย่างไร . .
Score:0
ธง nc

คำตอบก็คือ มายเอสคิวแอล เป็นแพ็คเกจที่ไม่สามารถจัดการการเชื่อมต่อกับ MySQL ได้อีกต่อไป เนื่องจากโปรโตคอลการตรวจสอบสิทธิ์ที่เข้มงวดขึ้นหลังจาก MySQL 8

แม้ว่า มายเอสคิวแอล ได้เรียกร้องในช่วง 2-3 ปีที่ผ่านมาว่าปัญหาเหล่านี้ได้รับการแก้ไขแล้ว แต่ยังคงมีอยู่

ดังนั้นคำแนะนำจากผู้ใช้รายอื่นคือให้ใช้ แพ็คเกจ npm mysql2 แทน.

ฉันพบว่านี่เป็นคำแนะนำที่ถูกต้องและฉันกำลังเชื่อมต่อ

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา