Se as linhas estão sendo impressas com valores vazios para cada coluna, o problema pode ser que o formato da resposta não é igual ao que foi programado na view.
Para validar isso, faça o seguinte teste no seu arquivo routes/produtos:
connection.query(sql, (err, data) => {
if (err){
console.log('houve um erro');
console.log(err);
return;
}
console.log(data);
//Verificando o formato da resposta
for(var i=0;i<data.length;i++) {
console.log('Linha Produto ');
console.log(i);
console.log(data[i]);
console.log('Campos Produto:');
console.log(data[i].id);
console.log(data[i].nome);
console.log(data[i].descricao);
console.log(data[i].valor);
}
res.render('produtos/lista', { lista: data });
connection.close();
});